happy coding

[c] 포인터와 배열 본문

self study/언어의 기본부터

[c] 포인터와 배열

yeoonii 2022. 11. 22. 15:59

포인터와 배열의 관계

배열은 배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같기 때문에 포인터 상수(constant pointer)라고 부르며, 포인터 상수는 포인터 변수가 가리키고 있는 주소 값을 변경할 수 없는 포인터를 의미하며, 상수 포인터(pointer to constant)란 상수를 가르키는 포인터를 의미한다.

int arr[3] = (1,2,3);	//배열 선언
int* ptr_arr = arr;	//포인터에 배열의 이름을 대입함

위의 코드에서 포인터에 배열의 이름을 대입한 후, 해당 포인터를 배열의 이름처럼 사용하게 되는데, C언어에서는 배열의 이름을 포인터처럼 사용할 수 있을 뿐만 아니라, 포인터를 배열의 이름처럼 사용할 수도 있다.

하지만 배열의 크기를 계산할 때 배열의 이름과 포인터 사이에 차이가 발생하는데, 배열의 이름을 이용한 크기 계산에서는 배열의 크기가 int형 배열 요소 3개의 크기인 12 byte로 제대로 출력되는 반면, 포인터를 이용한 계산에서는 배열의 크기가 아닌 포인터 변수 자체의 크기가 출력되는 차이가 있다.

배열의 포인터 연산

int arr[3] = {1,2,3};
printf("배열의 이름을 이용해 배열 요소에 접근 : %d %d %d\n",arr[0],arr[1],arr[2]);
printf("배열의 이름으로 포인터 연산을 해 배열 요소에 접근 : %d %d %d\n", *(arr+0), *(arr+1), *(arr+2));

위 코드에서 배열의 이름인 arr은 배열의 시작 주소를 가리키고, arr + 2는 배열의 이름부터 두 번째 배열 요소이고, *(arr + 2)는 이 위치의 값을 읽는다. 따라서 배열의 이름과 포인터 사이에는 다음과 같은 공식이 성립하며, 공식은 1차원 배열 뿐만 아니라 다차원 배열에서도 언제나 성립한다. 

arr이 배열의 이름이거나 포인터이고 n이 정수일 때, arr[n] == *(arr + n)이다.

포인터 배열과 배열 포인터

포인터 배열

포인터 배열이란 배열 요소로 포인터 변수를 가지는 배열을 의미한다. 즉, 포인터 변수를 저장할 수 있는 배열을 의미한다. 

int num01 = 1, num02 = 2, num03 = 3;
int* arr[3] = {&num01, &num02, &num03};	//int형 포인터 배열 선언

배열 포인터

배열 포인터란 배열을 가리킬 수 있는 포인터를 의미한다. 이를 정의해 사용하는 이유는 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있도록 하기 위함이다. 즉, 포인터를 배열처럼 사용하기 위해 배열 포인터를 정의해 사용한다. 

2차원 배열에서는 포인터 연산 시 증가하는 값이 행의 길이에 따라 차이를 보이게 되는데, 여기서 행의 길이란 부분 배열의 크기를 의미하며, 다음 수식으로 구할 수 있다.

sizeof(arr[0]) / sizeof(타입)

포인터 배열과 배열 포인터의 구분

int (*pArr)[3];	//int형 데이터를 저장할 수 있는 2차원 배열을 가리키는 배열 포인터
int* pArr[3];	//int형 데이터를 가리킬 수 있는 포인터 변수를 모아 놓은 배열을 가리키는 포인터 배열

괄호에 따라 2차원 배열을 가리키는 배열 포인터인지 포인터 변수를 모아 놓은 배열을 가리키는 포인터 배열인지가 달라지기 때문에 괄호의 유무는 중요하다.

main() 함수의 인수 전달

main()함수는 프로그램이 실행되면 제일 먼저 자동으로 호출되는 함수이다. 이러한 main()함수도 함수이기 때문에 인수를 전달받을 수 있고 반환값을 가질 수 있다.

void(또는 int) main(int argc, char *argv[]);	//main 함수 원형

main()함수의 첫 번째 인수는 int형 변수인 argc로 main() 함수에 인수로 전달되는 문자열의 개수를 명시하며, 두 번째 인수는 char형 포인터 배열인 argv로 main() 함수에 인수로 전달된 각각의 문자열이 저장된 배열을 가리킨다.


2차원 배열에서 (arr+1)은 arr[1]과 같은 곳을 가리킨다. (암기)

 

 

'self study > 언어의 기본부터' 카테고리의 다른 글

[c] 문자와 문자열  (0) 2022.11.25
[c] 메모리 관리  (0) 2022.11.22
[c] 포인터  (0) 2022.11.21
[c] 배열  (0) 2022.11.19
[c] 재귀 호출  (0) 2022.11.19
Comments