본문 바로가기

Language/C

포인터 와 배열


●포인터 와 배열

“배열명은 포인터 다!” 이말은 곧 배열명은 그 배열의 첫 번째 기억공간의 시작 주소 상수 이다. 이는 “첫 번째 배열의 주소 값“ 하고는 그 계념이 틀리다.

ex)char arr[5];

char *ap = arr;

으로 선언 했다고 가정 한다면 ap == &arr[0] 라고 볼수가 있다. 여기서 arr은 첫 번째 기억공간의 주소값을 문자화 시킨것이라고 볼 수 있다. 이런 사실을 통해 다음과 같은 법칙이 성립한다.

arr[0] == *(arr+0) == *(ap+0) == ap[0]

ex)int ary[10]={1,2,3,4,5,};

int *ip = ary;

 

printf("%u\n",ary);//3가지 모두 같은 값이다.

printf("%u\n",ip);

printf("%u\n",&ary[0]);

또한 arr이 포인터 이므로 역참조 연산자를 이용하여 값을 구할수도 있다.

arr[0] == *(arr+0) == *(ap+0) == ap[0]

ex)printf("%u\n",ary[0]);

printf("%u\n",*(ary+0));

printf("%u\n",*(ip+0));

printf("%u\n",ip[0]);

위의 결과값은 모두 1 로 나온다.

0번째 배열이 아닌 3번째 배열을 구할때도 위의 법칙은 성립한다.

 

○배열을 처리하는 함수

배열을 처리하는 함수는 전달인자로 포인터를 받아서 처리한다. 만일 아래와 같은 배열이 선언되었고

int arr[10];

이 배열을 초기값을 0으로 초기화 하는 것을 함수로 구현한다고 가정했을 때

inti_arr(&arr[0],&arr[1],&arr[2],&arr[3],&arr[4]....);//값을 넘겨줄때

int_arr(int *p1,int *p2,int *p3,int *p4,......);//값을 넘겨 받을 때

이런식으로 코딩을 하게되면 10개 배열은 가능해도 1000개 10000개 배열을 코딩자체도 힘들뿐더러 값을 하나 하나 넘겨주고 연산해주고 그것을 또 복사 해야하는데 int 형 으로 4byte 가 1000이상 복사되고 처리되면 오버플러가 생기게 된다. 심플한 로직을 만들기 위해서 하나하나 값을 넘겨 주지말고 어짜피 배열명은 배열의 첫 번째 기억공간 의 시작 주소값이고 배열명 자체가 포인터 이니

init_arr(arr);

로 선언을 하게 되면 더의상 값을 넘겨 주지 않아도 포인터 이기 때문에 전체 배열을 다른 함수에서 전달 받아 컨트롤 할 수가 이다.

ex)int max(int *);

void main()

{

int arr[]={3,2,1,6,5};

printf("Maximun : %d\n",max(arr));

}

int max(int ap[])//배열명을 전달인자로 줌으로써 배열의 첫번째 주소가

{ //넘어가는 것이다.

int tmax = 0;

int i;

for(i=0;i<5;i++)

{

if(*ap > tmax)

tmax = *ap;

ap++;

}

return tmax;

}

위 예제는 메인 함수에서 배열을 넘겨주고 max 함수에서 최대값을 구하는 소스 이다.