#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//#include <string.h>
// strlen() : 문자열의 길이를 구하는 함수
//배열을 받으려면 포인터를 사용해야한다.
//배열을 매개변수로 받는 함수는 배열의 크기를 같이 받는다.
//문자열의 끝은 널 문자(Null CHaracter => 따라서 배열의 크기를 알지 않아도 끝을 알 수 있다.)
//매개변수 1개 => 문자열을 저장하기 위한 객체 => pointer to char
int strlen(const char str)
{
/ arr : pointer to int
어떻게 문자열의 길이를 구할 수 있을까?
1. str은 문자열이다.
2. 문자열의 끝은 널 문자다. */
}
///strchr() : 문자열에서 특정 문자의 위치를 찾는 것
// 1. 문자가 있는 경우=> 그 문자의 위치
// 2. 문자가 없는 경우=> NULL/
// char* pos = strchr("Hello, 'l");
//char str = "asdasdasdasd"; => a =131313113213113 s=2465465131313 d= 341363132132
//char ch = 'd';
char strchr(const char* str , const char ch) {
while (*str != '\0') {
if (*str == ch)
{
return str;
}
++str;
}
return NULL;
}
int main(void)
{
int arr[10];
sizeof arr;
char asd[123] = "asdasdasdasd";
printf("%p", strchr(asd, 'd'));
printf("%c", toupper('A'));
return 0;
}
int toupper(char num) {
if ('a'<= num && num >= 'z') {
num = num - 32;
}
else {
num;
}
return num;
}
;//void Swap(int a, int b)
//{
// // a : 0x1234 -> 0xabcd
// b : 0x5678 -> 0x5780
// int temp = a;
// a = b;
// b = temp;
//}
//int main()
//{
// int a = 10, b = 20;
// Swap(&a, &b);
// printf("%d %d", a, b);
// return 0;
//
// int islower(char ch)
// {
// if ('a' <= ch && ch <= 'Z')
// {
// return 1;
// }
// else
// {
// return 0;
// }
// }
//// isupper()
// int isupper(char ch)
// {
// if ('A' <= ch && ch <= 'z')
// {
// return 1;
// }
// else
// {
// return 0;
// }
// }
//
// char tolower(char ch)
// {
// if ('A' <= ch && ch <= 'Z')
// {
// return ch + 32;
// }
// else
// {
// return ch;
// }
// }
//
// //
// char toupper(char ch123)
// {
//
// if ('a' <= ch123 && ch123 <= 'z')
// {
// return ch - 32;
// }
// else
// {
// return ch;
// }
// }
// tolower(대문자에서 소문자로) / toupper(소문자에서 대문자로)
//islower() : 한개의 문자를 받아 소문자인지 판별한다.
//
//char word[128] = "Hello, String!";
// //Hello,String => Drnken Jaesung
//strcpy(word, "Drunken Jaesung");
//char word3;
//strcpy(word2, word3);
//puts(word)
/*long long sum(int* a, int n)
{
long long result = 0LL;
for (int i = 0; i < n; ++i)
{
result += a[i];
}
return result;
}*/
//swap() : 2개의 정수를 받아 서로 데이터를 교환
/// <summary>
/*배열에 모든 원소를 더한다.
</summary>
<param name>
*/
/*
포인터는 다른 타입의 객체를 참조할 수 있는 타입이다.
Pointer : 데이터를 메모리 주소값으로 해석
Type* Identifier;
int num = 10;
int* P = #
int* P2 = NULL;
p를 통해서 null에 접근
pointer dereference
*p = 20;
왜? 포인터를 사용해야 하는가? 다른 범위에 있는 메모리에 접근하기 위해
int* p => pointer to int
int** p3; //pointer to pointer to int
int *** p4 = &p3; // pointer to pointer to pointer to int
메모리에 접근하는 방법은 2가지가 있다.
1. 직접 참조(Direct Regerence/ Direct Access) : 메모리 주소에 직접 접근하는 것
간접 참조(indirect Reference/ Indirect Access) : 메모리 주소를 포인터를 통해서 접근하는 것
Scope : 프로그램이 식별자를 찾을 수 있는 영역
Block scope => 지역변수 local variable
File Scope : 파일 내에서 접근 => 전역변수 Global Variable
Pointer Type 크기는 얼마인가?
Pointer Type :데이터를 메모리 주소값으로 해석한다.
x84 :4byte
x64 : 8byte
//+ - : 메모리 주소를 가리키고 있는 타입의 크기만큼 옮긴다.
//++ / --
// Address Operation : 주소 연산
char *pch // pointer to character
pch +1; // 1 바이트만큼 뒤로
pch -1; // 1 바이트만큼 앞으로
a[b] => *(a+b);
*p++;
*++p;
//주의 : 역참조 연산자와 증감 연산자를 결합할 때 연산 순서를 유의해야 한다.
void* p; // pointer to void (int, double.\, function, ~~)
//Dereference :
매개변수(parameter)
함수에서 사용되는 변수. 함수 외부에서 입력값을 받기 위해 사용.
함수를 사용한다는 것은 코드를 재사용하기 위함이다.
함수를 호출한다. 호출한 사람을 호출자(caller), 호출된 함수를 피호출자(calle)
// 호출자에게 내가 계산한 결과를 '반환'해줄 수 있다.
반환은 return문을 사용함. 반환 값은 반환 타입과 일치해야 함.
반환해줄 것이 없다면 void 타입을 사용.
// () : Call Operater
//3개의 입력을 받아 모든 입력값을 더해서 반환하는 함수 sum3()을 만들어라.
int sum3(int x,int y,int z)
{
return x+y+z;
}
long long sum(int* a, int n)
int a = sum(); //인자 (Argument) : 매개변수의 초깃값
*/
//입력 : 단어를 입력받는다.
//처리 : 알파벳 위치를 찾는다.
//
// 입력 : 반복 횟수와 문자열을 입력받는다.
/
그룹 단어 인지
/
// 입력 :
//처리 : 점수 계산
// 1. 0일 때 점수가 늘어감
// 2. 그 문제까지 연속된 0의 개수만큼 점수가 늘어남.
// 1. 현재 문제를 맞췄는가?
// 1-1, 맞았다면 연속적으로 맞춘만큼 점수를 부여한다.
//2. 1번으로 돌아가 문자열의 끝을 만날 때까지 반복한다.
//1. 현재 문제를 맞췄는가?
//Emty String
//pointer Type : 메모리 주소값으로 해석하는 타입
// 배열은 포인터 타입으로 암시적 변환 가능-> 포인터로 퇴행(decay) 했다.
//Buffer Overrun