경일게임아카데미 멀티 디바이스 메타버스 플랫폼 개발자 양성과정 20220502 2022/04/04~2022/12/13

Jinho Lee·2022년 5월 2일
0

경일 메타버스 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); 와 같다.

상수 포인터

  • 포인터 타입도 const 타입의 수식을 받을 수 있다. 상수 포인터는 주소 연산이 불가능하다.
    역참조 연산자 * 뒤에 const를 붙여 선언한다.
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

문자열 리터럴

  • 문자열 리터럴은 Main()가 호출되기 전 데이터 영역 어딘가에 만들어두고 사용한다. 그래서 포인터로 문자열 리터럴을 가리킬 수도 있다.
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'; // 액세스 위반으로 프로그램이 종료된다.

0개의 댓글