포인터 배열이란 무엇인가..... 말 그대로 포인터 변수를 저장하는 배열이다.

int nums[3]은 int를 저장하는 배열 int* nums[3] int*를 저장하는 배열이다.

 

 

C언어 포큐아카데미

num_pointers라는 포인터 배열은 nums1, nums2, num3의 주소를 저장하는 배열이다. 

num_pointers[0][0], num_pointers[0][1] 과 같이 2차원 배열처럼 접근 할 수있다.

 

그럼 2차원 배열이랑 포인터 배열이랑 똑같네?? 아니!!!!

 

2차원 배열과 포인터 배열이 같다?(아니다)

에러(C언어 포큐아카데미)

 

matrix라는 2차원 배열을 만들고 do_magic에서는 포인터 배열로 받았다 왜냐? 둘은 똑같으니깐

이렇게 하면 컴파일 에러가 난다!. 왜냐? 2차원 배열과 포인터 배열은 다르니깐

 

2차원 배열은 한덩어리 메모리라 주솟값이 저장된 곳이 없다. 반면 포인터 배열은 각각의 요소에 주소가 저장된다.

(밑에서 더 자세히)

 

 

수정(C언어 포큐아카데미)

위와 같이 2차원 배열은 2차원 배열로 받아야한다. 그래야 컴파일러가 offset을 이해할 수 있다.

 

 

 

#include <stdio.h>


int main(void)
{
    const int nums[3][5] = {
        { 35, 50, 65, 24, 71 }, 
        { 52, 93, 30, 18, 83 },
        { 72, 53, 41, 88, 69 }
    };
    const int* nums2[3];
    
    nums2[0] = nums[0];
    nums2[1] = nums[1];
    nums2[2] = nums[2];
    
    printf("nums[0] address: %p\n", (void*)nums[0]);
    printf("nums[1] address: %p\n", (void*)nums[1]);
    printf("nums[2] address: %p\n", (void*)nums[2]);
    printf("nums[2]'s offset from nums[0]: %d\n", nums[2] - nums[0]);         /* 10 */
    printf("nums[1]'s offset from nums[0]: %d\n", nums[1] - nums[0]);         /* 5 */
    
    printf("\n");
    
    printf("nums2[0] address: %p\n", (void*)&nums2[0]);
    printf("nums2[1] address: %p\n", (void*)&nums2[1]);
    printf("nums2[2] address: %p\n", (void*)&nums2[2]);
    printf("nums2[2]'s offset from nums2[0]: %d\n", &nums2[2] - &nums2[0]);   /* 2 */
    printf("nums2[1]'s offset from nums2[0]: %d\n", &nums2[1] - &nums2[0]);   /* 1 */
    
    return 0;
}

nums는 2차원배열, nums2는 포인터 배열이다. 주목해야 할 점은 offset(얼마나 떨어져있냐)의 값이다.

2차원 배열의 경우 nums[0]과 nums[1]은 5만큼 떨어져있다. 그 말을 풀어서 이야기하면 nums[0]인 35와 nums[1]인 52 사이에 5개의 메모리 블럭이 존재한다고 보면 되겠다.(좀 더 정확히 하면 4바이트 * 5 = 20바이트 만큼 떨어짐)

 

반면 포인터 배열의 경우 nums2[0]과 nums[1]의 offset은 1이다. 왜냐하면 각각의 메모리 블럭에 주소가 저장되어 있기 때문이다.(하나의 포인터의 크기만큼 떨어져있다)

 

- C언어 포큐 아카데미 복습 -

'C' 카테고리의 다른 글

C언어 얕은복사 vs 깊은복사  (0) 2019.12.18
C언어 구조체  (0) 2019.12.18
C 포인터 const  (0) 2019.12.12
C언어 배열과 포인터 차이점  (0) 2019.12.12
C 스택 메모리 해부(어셈블리어)  (3) 2019.12.09

+ Recent posts