본문 바로가기

C 언어

C언어 0.09 - 문자열 배열과 포인터 배열 문자열 배열과 포인터 배열의 차이점 아래의 수식이 왜? 불가능할까? &ar, ar 을 출력해보면 아마도 같은 값이 나오는 것을 볼 수 있을 것이다. 어찌보면 이 둘은 같아보이지만 틀리다. ar 은 포인터 상수로 정확한 타입은 int* const 이다. &ar은 크기가 5인 정수형 배열이며 타입은 int(*)[5] const 이다. int ar[5] = {1,2,3,4,5}; int *pi; pi = ar; // 가능 pi = &ar; // 불가능 고로 &ar 은 배열 전체에 대한 주소이기 때문에 pi 포인터 상수에 대입하려고 할 때 오류가 나는 것이다. 해결 방법은 아래와 같이 수정해야 대입을 할 수 있다. int (*pi)[5]; pi = &ar; 여기서 (*pi)[5] 와 *pi[5] 는 굉장히 다르.. 더보기
C언어 0.08 - 동적할당 @Required #include // malloc, free 함수가 선언된 헤더 파일 선언 ( Declare ) 우선 주소를 할당하는 것이기 때문에 좌변에는 Pointer 타입의 변수가 필요하다. (Type은 원하는거 사용가능) 우변에는 type의 사이즈에 원하는 데이터의 개수를 곱하면 된다! int *numptr; numptr = malloc(sizeof(int) * N) [ 예시 ] #include #include // malloc, free 함수가 선언된 헤더 파일 int main() { int num1 = 20; // int형 변수 선언 int *numPtr1; // int형 포인터 선언 numPtr1 = &num1; // num1의 메모리 주소를 구하여 numPtr에 할당 int *numPtr.. 더보기
C 언어 0.07 - bool 자료형 @Required #include // bool, true, false가 정의된 헤더 파일 [ 소스 코드 ] #include #include // bool, true, false가 정의된 헤더 파일 int main() { bool b1 = true; if (b1 == true) // b1이 true인지 검사 printf("참\n"); // b1이 true이므로 참이 출력됨 else printf("거짓\n"); return 0; } 더보기
C 언어 0.05 - 포인터 ( pointer ) Pointer 란? 쉽게 말해서 메모리 상에 위치한 특정한 데이터의 주소값을 보관하는 변수이다. 포인터는 하나의 타입으로 32 비트 : 4 byte 64 비트 : 8 byte 를 차지한다. int *p = &a; 이중 Pointer #include int main() { int *numPtr1; // 단일 포인터 선언 int **numPtr2; // 이중 포인터 선언 int num1 = 10; numPtr1 = &num1; // num1의 메모리 주소 저장 numPtr2 = &numPtr1; // numPtr1의 메모리 주소 저장 printf("%d\n", **numPtr2); // 20: 포인터를 두 번 역참조하여 num1의 메모리 주소에 접근 return 0; } 포인터도 실제로는 변수이기 때문에 메.. 더보기
C 언어 0.04 - 배열 ( array ) 배열의 기초 /* 배열 기초 */ #include int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int arr[] = {1,2,3,4,5} // 크기가 5인 배열 printf("Array 3 번째 원소 : %d \n ", arr[2]); return 0; } 배열은 말 그대로 특정한 형의 변수들의 집합이다. 배열의 선언은 다음과 같다. ( 배열의 타입 ) ( 배열의 이름 ) [원소 개수] ; 다음과 같은 코드가 있을 때 컴파일러는 내부적으로 int arr[3] = {1,0,0} 이라고 생각한다. int arr[3] = {1}; 고차원 배열 /* 2 차원 배열 */ #include int main() { int arr[3][3] = {1, 2, .. 더보기
C 언어 0.03 - 문자열 ( string ) 선언 ( Declare ) 아래와 같이 선언해주면 된다. 유의할 점 %s 사용할 것 string 타입은 문자열의 끝을 컴퓨터에게 알려주기 위해서 ' \0 ' 을 반드시 넣기 때문에 문자열의 길이 + 1 을 반드시 해줘야한다. 원하는 배열의 크기 + 1 반드시 해줘야 한다~ Null 의 아스키코드는 0 이다. 문자 '0' 의 아스키코드는 48 /* 문자열의 시작 */ #include int main() { char sentence_1[4] = {'P', 's', 'i', '\0'}; char sentence_2[4] = {'P', 's', 'i', 0}; char sentence_3[4] = {'P', 's', 'i', (char)NULL}; char sentence_4[4] = {"Psi"}; char .. 더보기
C 언어 0.02 - fgets vs scanf fgets vs scanf scanf : 문자를 입력 받을 때 공백문자(' ', '\n', '\t') 만나기 전까지만 입력 받을 수 있다. 그 이유는 scanf 는 stdin 에서 데이터를 얻어오기 때문에 stdin 에서 위 세 개의 문자열을 만난다면, 아 여기서 입력은 끝이구나 하고 입력을 종료해버리기 때문이다. printf("30 자 이내의 문자열을 입력해주세요! : "); scanf("%s", words); // 실행결과 30 자 이내의 문자열을 입력해주세요! : what is your name 문자열 : what fgets : 스트림에서 문자열을 받아서 (num - 1) 개의 문자를 입력 받을 때 까지나, 개행 문자나 파일 끝(End-of-File) 에 도달할 때 까지 입력 받아서 C 형식의 문자.. 더보기
C 언어 0.01 - 변수 (variable) 변수란 무엇인가? 컴퓨터는 많은 내용들을 기억해야 한다. 많은 내용들을 기억하기 위해서는 기록들을 저장할 일종의 저장소가 필요한데 컴퓨터에서는 RAM이라는 특별한 기억공간이 저장소의 역할을 하게 된다. 변수는 바뀔 수 없는 어떤 값을 보관하는 곳이다. 그릇이라고 생각하면 편하다. 변수의 종류 타입 크기 표현식 char 1 byte %c short 2 byte %sh int 4 byte %d long 4 byte %ld longlong 4byte or 8byte %lld float 4byte %f double 8byte %lf 배경색: usually use. 추가적으로 %o : 8진수로 표현. %x : 16진수로 표현. 변수 선언 int main() { float a = 3.141592f; // doubl.. 더보기