경일 메타버스 20220502 5주차 1일 수업내용. C언어 포인터, 문자열 리터럴
C언어 프로그래밍 https://docs.google.com/document/d/1pTQ2cg7jq36qksTc5IRbD86jXhDA6vpIgkhbzS9uyrk/edit
https://nesoy.github.io/articles/2018-01/CleanCode-Comment
int arr[5] = { 1, 2, 3, 4, 5 };int* p = arr;
// 포인터로 변환이 일어났다.
// 이 경우 arr의 첫 번째 원소의 주소값이 저장된다.
p = 20; // arr은 이제 { 20, 2, 3, 4, 5 }다.
int arr[5][5];
int arr2[5][5][5];
int** p = arr; // 2차원 배열은 이중 포인터를 사용한다.
int*** p2 = arr2; // 3차원 배열은 삼중 포인터를 사용한다.
int arr[5];arr[2];
// *(arr + 2);와 같다.
int arr2[5][5];
arr2[2][3];
// *(*(arr2 + 2) + 3); 와 같다.
int arr[5] = { 1, 2, 3, 4, 5 };
// 상수 포인터는 * 뒤에 const를 붙이면 된다.
int * const p = arr; // const pointer to int
*p = 20; // 가리키고 있는 타입이 int이므로 역참조하여 값을 수정할 수 있다.
// 이때 배열은 { 20, 2, 3, 4, 5 }
++p; // 컴파일 오류
// const pointer이기 때문에 주소 연산이 불가능하다.
const int* p2 = arr; // pointer to const int
*p2 = 10; // 컴파일 오류
// 가리키고 있는 타입이 const int 이므로 수정 불가능
++p2; // const pointer가 아니므로 주소 연산 가능
// p2 = &arr[1]
const int * const p3 = arr; // const pointer to const int
*p3 = 20; // 컴파일 오류
++p3; // 컴파일 오류
int * const * const p4 = &p; // const pointer to
const char* str = "Hello World!";
char str[] = "Hello World!"; // 데이터 영역에 있는 문자열
// "Hello World!"를 str에 복사한다.
str = "Hello"; // str의 타입은 배열이고,
// 문자열 리터럴의 타입은 const char*이다.
char* str = "Hello World!"; // 설사 char*으로 가리킨다 한들
str[2] = 'o'; // 액세스 위반으로 프로그램이 종료된다.