본문 바로가기
카테고리 없음

배열이름은 그자체가포인터이다.

by ByteBridge 2013. 2. 20.
반응형

배열이름은 그 자체가 포인터이다

배열의 첨자 연산은 실제로 포인터 연산이기때문이다.

1차원배열의 포인터는 정수형 변수의 포인터를 선언하는방법과 같다.
int a[5];
int *pa;
pa = a;

배열 a는 상수의 성격을 갖는 변수로 선언된다.
int a[5];
int * const a; a를 a[0] 번지로 초기화할수만 있는 상수로써 선언 
이렇게 변수가 상수로 선언되는 경우 a는 더이상 다른변수의 주소를 가질수없다.

int* pa=a;/정수형 포인터끼리의 대입이 가능

배열에 &연산자 사용
array 가 1차원 배열의 포인터이므로 &array 는 2차원배열의 포인터가 된다.
다라서 다음과 같이 컴파일할경우 에러가 발생하며 
이것을 해결하려면 int(*p)[5];와같은 2차원배열의 포인터 선언이 필요하다.

2차원배열의 포인터 선언과초기화
int array[2][5];
int (*parray)[100];2차원배열의 포인터 선언
parray=array;//포인터 초기화
2차원 배열의 포인터는 1차원배열 포인터의 선언에 괄호를 감싼후,1차원배열요소의 수를 추가하여 생성한다.
여기서 array 의 1차원배열 요소는 5이므로 [5]를 선언하여 사용한다.

만약 배열의 요소가 다르다면 다음과 같이 그 요소에 맞게 선언해야한다.
int array[2][100];
int (*parray)[100];/1차원배열의 요소를 [100]으로 하는 포인터 선언

2차원배열의 포인터를 선언하고 초기화 하려면 다음과 같이 2가지 방법만 사용
int array[2][5];
int (*parray)[5];//2차원배열의 포인터 선언 및 초기화
parray = array;//포인터 초기화방법1
parray=&array[0];//포인터 초기화 방법2
parray=&array[0][0];//서로 데이터형이 다르므로 사용할수없다.

2차원배열의 포인터는 초기화 된후 2차원배열을 사용하듯이 사용할수있다.
int array[2][5];
int (*parray)[5]=array;
parray=&array[0][0]=5; -->array[0][0]=5 ; 와 동일하다
array[0][1] = parray[0][2]; -->array[0][1]=array[0][2];와 동일하다.

3차원 배열의 포인터 선언초기화

int array[2][5][10];
int (*parray)[5][10]; 3차원배열의 포인터 선언
parray=array; 포인터 초기화방법1 
parray=&array[0]; 포인터 초기화 방법2

3차원배열의 포인터는 초기화된후 3차원배열을 사용하듯이 사용
int array[2][3][4];
int (*parray)[3][4]=array;
parray[0][0][0]=5;  array[0][0][0]=5 와 동일
array[0][0][1] = parray[0][1][2]; array[0][0][1]=array[0][1][2]; 와 동일

포인터 변수의 연산
포인터 변수는 다른 변수의 주소값을 갖는 변수이다.또한 배열변수의 번지값을 갖는 변수이기도하다.
int array[5];
int *parray=array;

parray 는 array 배열의 선두 번지값을 갖는 포인터이며,parray를 통한 배열 요소의 접근은 다음과 같다.
parray[0] = 5;//array[0] = 5;와 동일
parray[3] = 7 ; // array[3]=7; 와 동일

배열의 첨자는 번지에 대한 포인터 연산이며,array[3]은 array의 번지값으로부터 3 X (데이터형)만큼 주소가 이동된곳에 위치해 있는 배열변수를 뜻한다.
그러므로 array[3] 의 번지는 array 로부터 12번지만큼 이동한곳이다.

포인터 변수의 연산은 포인터 변수가 가리키는 데이터 형의 크기만큼 증감된다.
배열및포인터 연산은 포인터 연산과 같다.

반응형