개인공부/C언어(71)
-
C언어 - 메모리 레이아웃과 문자열 (Memory Layout )
지역변수들이 stack에 쌓인다. 컴파일러가 미리 크기를 알수 있다면 미리 준비를 할수있다. 메모리 크기가 얼마될지 예상이 안될경우 heap이라는 메모리를 사용한다. 초기화된 전역/정적 변수들은 변수들이 어떻게 초기화가 되어야 할지를 미리 알고있다. 컴파일할때 이미 결정되어있기 때문에, 프로그래밍 한 값으로 바로 값이 결정됨 초기화되지 않은 전역/정적 변수들은 0으로 초기화. arr배열자체가 메모리를 가지고 있으니 값을 얼마든지 바꿀수있음. char* str = "Hello, World"; str 포인터는 "Hello, World" 스트링 리터럴이 저장되어 있는 공간을 바꿀 방법이 없다. 문자열 리터럴들은 컴파일때 이미 값이 정해져있다. 읽기 전용으로 들어감. 읽기전용에서 쓰기를 시도하니 운영체제에서 막..
2020.11.12 -
C언어 - 문자열을 정의 하는 방법
남는 공간에 null character를 채워준다. #define _CRT_SECURE_NO_WARNINGS #include #define MESSAGE "A symbolic string contant" #define MAXLENGTH 81 int main() { char words[MAXLENGTH] = "A string in an array"; // char 타입의 배열 // 배열자체가 메모리를 가지고 있다. const char* pt1 = "A point to a string."; // 문자열에 대한 포인터 // 포인터는 어딘가에 저장되어있는 것의 첫번째 주소를 가져오는 것 //puts 함수는 문자열을 출력 puts("Puts() adds a newline at the end:"); // puts(..
2020.11.12 -
C언어 - 복합리터럴과 배열 ( Compound Literals )
#define _CRT_SECURE_NO_WARNINGS #include #define ROWS 3 #define COLS 4 int sum_1d(int arr[], int n); int sum_2d(int arr[][COLS], int rows); int main() { int a = 1; // 1리터럴의 값을 a에 넣는것 3; // Literal 은 기호 없는 상수. 3.14f; int b[2] = { 3,4 }; // 3,4두개의 숫자가 brace로 묶여있고 // b라는 심볼로 인식할수있는 2개짜리 배열에 들어간것. (int[2]) {3, 4};// 기호가 없다, compound literal //int c[2] = (int[2]){3,4}; // Error int arr1[2] = { 1,2 };..
2020.11.12 -
C언어 - 포인터의 호환성(Compatibility)
문법적으로 가능하지만 사용하기를 권장하지 않는 내용들. #define _CRT_SECURE_NO_WARNINGS #include int main() { ///* Pointer Compatibility */ //int n = 5; //double x; //x = n;//no error //int* p1 = &n; //double* pd = &x; //pd = p1; // warning //// int를 double에 넣는 건 가능하나 warning //int* pt;//그냥 포인터 //int(*pa)[3];//3개짜리 원소를 가진 배열에 대한 포인터를 담을수 있는 그릇 //int ar1[2][3] = { 3, }; //int ar2[3][2] = { 7, }; //int** p2;// 이중포인터 //pt ..
2020.11.12 -
C언어 - 2차원 배열과 포인터
배열의 이름은 주소이다.( 첫번째 원소의 주소) arr 이름이 a[0][0] 주소가 아니라 &arr[0] 이다. arr[0]과 &arr[0]이 배열에서는 같다. 하지만 포인터의 배열에서는 달라진다. #define _CRT_SECURE_NO_WARNINGS #include int main() { float arr2d[2][4] = { {1.0f,2.0f,3.0f,4.0f},{5.0f,6.0f,7.0f,8.0f} }; //주소가 같다 printf("%u\n", (unsigned)arr2d); printf("%u\n", (unsigned)arr2d[0]); printf("\n"); // arr2d points to arr2d[0] (not arr2d[0][0]) //주소가 다 같다 printf("%u\n", ..
2020.11.12 -
C언어 - 포인터의 배열과 2차원 배열
포인터의 배열을 이용한다면 배열의 배열을 만들수 있지않을까? 배열의 배열은 2차원배열 혹은 다차원 배열을 떠올릴수있다. #define _CRT_SECURE_NO_WARNINGS #include int main() { /* Two of 1D arrays*/ ////int arr0[3] = { 1,2,3 }; // 배열의 이름은 첫번째 주소처럼 사용할수있다. ////int arr1[3] = { 4,5,6 }; ////int* parr[2] = { arr0, arr1 }; // an array of pointers // parr 포인터의 배열의 첫번째 원소에 arr0가 들어간다. // 포인터가 담길수있는 메모리 공간을 두개 확보한 배열이 되는것. //for (int j = 0; j < 2; ++j) //{ /..
2020.11.12