본문 바로가기

c

c - 포인터 배열과 2차원 배열의 차이

  const int nums[5][5] = {
    {1,2,3,4,5},
    {1,2,3,4,5},
    {1,2,3,4,5},
    {1,2,3,4,5},
    {1,2,3,4,5}
  };

우선 일반 const int 배열을 하나 생성해주었다.

const int* nums2[5];

그리고 포인터 배열을 생성하였다.

 

  nums2[0] = nums[0];
  nums2[1] = nums[1];
  nums2[2] = nums[2];​

포인터 배열의 윗 값들에 nums배열의 각 값을 대입해준다. 그리고 아래 코드의 값을 보자

 

printf("%d",nums[2] - nums[0]);
/* 10 */

nums[2]에서 nums[0]의 값을 빼주었다. 이때 값은 10이 나온다.

offset개념으로 말인즉, nums는 2차원 배열이기 때문에 한 줄에 5개의 데이터가 들어간다.

근데 값이 2만큼 차이가 나니까 5x2 = 10이기 때문에 출력값은 10이다.

 

printf("%d",&nums2[2] - &nums2[0]);
/* 2 */

그러나 &nums2의 경우에는 다르다.

이때는 값이 2가 나온다. 여기서 저장하는 변수의 종류는 포인터(메모리 주소)이기 때문에 각 값들의 offset은 하나씩 차이가 난다.

따라서 출력값은 2.

 

여기서 알 수 있는 건 2차원 배열과 포인터 배열은 얼핏 보기엔 비슷하지만 실제로 메모리에 저장되는 방식은 전혀 다르다는 점이다.

즉, 포인터 배열에 실제로 저장된 값은, 각 줄마다 하나의 메모리주소값뿐이다.

실제로 일반 배열처럼 모든 데이터가 저장된 것이 아니고 각줄마다 그 주소값만 저장되어있는 것이다.

물론 각 데이터에 접근하려면 각 주소를 통해 접근은 가능하다

 

 

역시 c언어는 어렵다.

'c' 카테고리의 다른 글

c - 메모리 할당, 해제, 누수  (0) 2022.10.10