포인터 활용
-
이중 포인터 : 싱글 포인터를 가리키는 포인터
int i = 100; int *p = &i; // p는 싱글 포인터 int **q = &p; // q는 이중 포인터
- 포인터 배열 : 포인터들을 모아서 배열로 만든 것, 배열의 원소가 포인터
1) 정수형 포인터 배열 int* api[5];
2) 문자형 포인터 배열 char* fname[4];- 각 행들의 길이가 가변적으로 변할 수 있어서 래그드 배열이라고 불린다.
- 래그드 배열이 일반적인 2차원 배열보다 좋은 점
- 2차원 배열에서는 사용하지 않는 공간이 낭비될 수 있다
- 래그드 배열에서는 낭비되는 공간이 없다
- 배열 포인터 : 배열을 가리키는 포인터
- 배열의 이름은 첫 번째 배열 원소를 가리키는 상수 포인터
- 배열 포인터는 배열 전체에 대한 포인터
- int (*pa)[10]; // int [10] 배열에 대한 포인터 선언
- 함수 포인터 : 함수를 가리키는 포인터
- 반환형 (*함수 포인터 이름) (매개변수 1, 매개변수 2, … )
- 함수의 이름은 배열의 이름과 같이 시작 주소를 나타내는 포인터 상수
- 함수의 이름 앞에 &연산자를 사용할 필요가 없다
- int (*pf)(int, int);
- 함수 포인터의 배열
- 반환형 (*배열이름[배열의 크기]) (매개변수1, 매개변수 2, … )
- 함수를 가리키는 포인터들의 배열
- int (*pf[5])(int, int);
- 다차원 배열과 포인터 - 2차원 배열을 메모리에 저장하는 방법
- 행우선 방법(row-major)
- 행을 기준으로 하여서 상위 행을 먼저 저장하는 방법. m[0][0], m[0][1] 과 같은 0번째 행에 속하는 원소들을 먼저 저장한 후에, m[1][0], m[1][1] 와 같은 1번째 행에 속하는 원소들을 저장 방법
- C에서는 행우선 방법이 사용
- 열우선 방법(column-major)
- 상위 열을 먼저 저장하는 방법
- 상위 열을 먼저 저장하는 방법
- 행우선 방법(row-major)
- const 포인터와 volatile 포인터
- const char *p; // 포인터가 가리키는 대상이 변경이 가능, 하지만 내용은 포인터의 내용은 변경 가능하지 않음
- char *const p; // 포인터 자체가 변경되지 않음, 하지만 포인터가 가리키는 내용은 변경 가능
- volatile char *p; // p가 가리키는 내용이 수시로 변경되니 사용할 때마다 다시 로드하라는 의미
- void 포인터
- 순수하게 메모리의 주소만을 가지고 있는 변수
- 어떤 대상을 가리킬 것인지 정하지 않음
-
* 연산자 불가능, 가리키는 대상이 없기에 -> 명시적 형변환 하면 가능
- 증감 연산자 불가능
- main 함수의 인수
- int main(int argc, char *argv[])
- argc -> 명령어가 가지는 인수들의 개수
- argv -> 명령어가 가지는 인수들을 문자열 형태로 전달
- int main(int argc, char *argv[])