C language - 5. array of pointer and pointer to array(포인터 배열과 배열 포인터)


1. 포인터 배열

포인터 배열은 포인터로 선언되어 주소값이 배열 형태로 저장되는 변수입니다.

#include <stdio.h>
void main()
{
int n1 = 123, n2 = 456, n3 = 789;
int* arr[3] = {&n1, &n2, &n3}; // 포인터 배열
printf("%d\n%d\n%d\n", *arr[0], *arr[1], *arr[2]);
}
view raw example hosted with ❤ by GitHub
아래 표와 같이 포인터 배열은 단순히 주소값을 저장하는 포이터변수가 배열처럼 나란히 붙어서 선언된것 입니다.


2. 배열 포인터
1차원의 배열을 함수의 매개변수로 보낼때나 배열의 주소를 알아낼때 배열의 이름을 그대로 포인터 형태로 사용하게 됩니다. 그러나 다차원 배열을 이렇게 사용하게되면 1차원만큼만 가져오게됩니다. 그래서 사용하는것이 배열 포인터입니다.

#include <stdio.h>
void main()
{
int arr1[2][2] = {
{1, 2}, {3, 4}
};
int arr2[3][2] = {
{1, 2}, {3, 4}, {5, 6}
};
int arr3[4][2] = {
{1, 2}, {3, 4}, {5, 6}, {7, 8}
};
int (*ptr)[2]; // 배열 포인터
int i;
ptr = arr1;
for(i=0; i<2; i++)
printf("%d %d\n", ptr[i][0], ptr[i][1]);
printf("\n");
ptr = arr2;
for(i=0; i<3; i++)
printf("%d %d\n", ptr[i][0], ptr[i][1], ptr[i][2]);
printf("\n");
ptr = arr3;
for(i=0; i<4; i++)
printf("%d %d\n", ptr[i][0], ptr[i][1], ptr[i][2], ptr[i][3]);
}
view raw example hosted with ❤ by GitHub

배열 포인터는 '변수타입 (* 변수명)[n];'의 형태로 선언합니다. 이때 배열 포인터는 변수타입의 크기만큼의 포인터가 n칸 만큼 뛰어넘어 가리킨다는것을 뜻합니다. 설명으론 이해하기 힘드므로 예제의 내용을 설명하면
예제에서 배열 포인터 ptr은 위와 같이 가리키게 됩니다. ptr[i][0]은 가리키는 배열의 0번째 열을 ptr[i][1]는 1번째 배열만을 계속해서 가리키게 됩니다.

출력결과

사실 다차원 배열이라고 해서 위의 표처럼 저장되는것이 아닙니다.

arr3의 배열은 위 표처럼 순서대로 저장됩니다. 처음 배열 포인터를 설명할때 선언된 n의 크기만큼 뛰어 넘는다는 설명을 했는데 실제로 배열 포인터가 하나씩 가리키는 주소가 아래의 그림처럼 선언된 int의 크기에 선언된 n의 크기만큼 뛰어넘어가면서 가리키기 때문입니다.

포인터 배열과 배열포인터를 설명했습니다. 이 둘은 각각 주소값을 저장하는 포인터를 배열 형태로 선언 한다는것과 다차원 배열을 가리키는 포인터라는 점에서 서로 의미가 다른데 모양이 비슷하여 혼동되기 쉽습니다.

int * parr[n];
int (*arrp)[n];

보시는 바와 같이 배열포인터에 소괄호가 있다는것에서 차이가 나게됩니다.

Related Posts:

  • C language - 3. file I/O(파일 입출력) 파일 입력함수에는 getc(), fgetc(), fgets(), fscanf(), fwrite()가 있고 파일 출력함수에는 putc(), fputc(), fputs(), fprintf(), fread()가 있습니다. 1. 텍스트 파일 입출력 #… Read More
  • C language - 2. standard I/O(표준 입출력)1. 표준 입출력  C언어에서 입출력 함수는 표준 입출력함수와 파일 입출력함수로 나뉩니다. 파일 입출력은 외부에서 값을 입력받거나 저장하는 반면에 표준 입력함수는 일반적으로 키보드의 입력을 받고 표준 출력함수는 일반적으로 모니터에 출력을 하게됩니다. 표준… Read More
  • C language - 6. pointer(포인터)1.  메모리와 주소 컴퓨터의 메인메모리는 1byte 단위로 각각 주소가 16진수의 고정된 값이 배정되며 오른쪽 그림을 예를 들어 int(4bytes)형 변수 a를 선언 한다고 했을 때 임의의 연결된 4bytes의 공간에 int형 변수 a가 배정되게 됩니다.… Read More
  • C language - 4. string function(문자열 함수)<string.h>의 헤더파일에는 문자열과 관련되있는 함수들을 정의하고 있습니다. 1. 문자열 복사  문자열을 복사하는 함수에는 strcpy()와 strncpy()가 있습니다. strncpy() 함수에서 str3보다 1작은 크기만큼 복사해야… Read More
  • C language - 5. array of pointer and pointer to array(포인터 배열과 배열 포인터) 1. 포인터 배열 포인터 배열은 포인터로 선언되어 주소값이 배열 형태로 저장되는 변수입니다. 아래 표와 같이 포인터 배열은 단순히 주소값을 저장하는 포이터변수가 배열처럼 나란히 붙어서 선언된것 입니다. 2. 배열 포인터 1차원의 배열을 함수의 매개변수로… Read More