본문 바로가기

C programming/[Algorithm problem]

#1-5. 포인터 배열과 포인터 연산

728x90
반응형

포인터 배열

포인터 배열이란 말 그대로 포인터를 요소로 갖는 배열을 말한다. 다음 코드를 살펴보자.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
    
    int data[][2] = {{10,20},{30,40},{50,60},{70,80},{90,100}};
    int (*pdata)[2] = data; //배열을 포인터화

    int *ptr[5]; // 포인터 배열
    for(int i=0;i<5;i++) ptr[i] = &pdata[i][0];

    for(int i=0;i<5;i++){ // 포인터로 참조
        printf("pdata : 0x%p, **pdata : %d, *(*pdata+1) : %d\n",pdata,**pdata,*(*pdata+1));
        pdata ++;
    }
    for(int i=0;i<5;i++) // 포인터로 참조
          printf("ptr[%d] : 0x%p, *ptr[%d] : %d, *(*ptr[%d]+1) : %d\n",i,ptr[i],i,**(ptr+i),i,*(ptr[i]+1));
}

이전 포스팅을 봤다면 16번째 코드까지는 이해하기 쉬울 것이다. 하지만 18번째 코드 줄을 잘 확인하자.

 printf("ptr[%d] : 0x%p, *ptr[%d] : %d, *(*ptr[%d]+1) : %d\n",i, ptr[i], i, **(ptr+i),i, *(ptr[i]+1) );
ptr[i] 포인터 배열의 i 번째 요소, 즉 이중 배열인 data 배열의 첫번째 배열 시작점의 메모리 주소가 저장장되있는 포인터 배열이다. 
 **(ptr+i) 포인터 배열이 참조한 배열의 요소값. 다시 말해 data 배열의 i 번째 배열의 요소값이다.
 *(ptr[i]+1) data 배열의 i+1  번째 배열의 요소값이다.
이때 참조 연산자를 한번 사용한 이유는 이미 포인터 배열의 행 위치를 알기 때문이다.

정리하자면, 포인터 배열 ptr을 사용해 첫 번재 열 요소값을 출력하려면  *ptr[i]을 사용하고 마찬가지로 두 번째 열 요소값은 *(ptr [i]+1)을 사용할 수 있으며 참조 연산자를 이용해서도 가능하다.

포인터 연산의 이해

포인터가 배열과 다른 점 중 하나는 포인터가 연산이 가능하다는 것이다. 예를 들면 메모리의 연속된 공간을 포인터의 연산만으로 접근할 수 있다는 것이다.

 

다시 말해 임의의 포인터 ptr이 0x0012FF68 이라는 값을 가지고 있을 때, 주소값을 1을 증가하면 0x0012FF6C로 주소가 바뀐다. 이는 ptr + 1의 연산 개념이 실제 int 자료형 값 1을 더하는 것이 아닌 포인터 변수의 자료형이 차지하는 메모리 공간 크기의 기준 단위만큼 더하라는 뜻이기 때문이다.

 

즉, ptr + 1은 'ptr + int 자료형의 메모리 크기'가 된다.

 

int 자료형은 크기가 4바이트 이므로 그에 맞춰 주소의 값이 바뀌는 것이다.

 ( ptr + 1 ) ➡  'ptr + int 자료형의 메모리 크기'

예제 프로그램을 통해 정리해보자.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
    char arr[6] = {'a','b','c','d','e','f'};
    char *parr = arr;
    
    printf("parr을 1씩 증가해보자.\n");
    for(int i=0;i<6;i++){ printf("parr = 0x%p, *parr : %c\n",parr,*parr); parr++;}
}

해당 프로그램에서 parr의 메모리 주소에 1을 추가하여 주소를 변환하였고 그에 따라 저장돼있는 값들이 다 다르게 출력되는 것을 알 수 있다. 이를 응용하면 ++와 같은 단항 연산자를 이용하여 작성할 수 있다.

728x90
반응형

'C programming > [Algorithm problem]' 카테고리의 다른 글

#2-1. 연결 리스트  (0) 2023.09.04
#1-6. 포인터의 활용  (0) 2023.09.04
#1-4. 배열과 포인터  (0) 2023.09.03
#1-3. 포인터  (0) 2023.08.31
#1-2. 배열과 검색  (0) 2023.08.31
댓글