c - 함수 - 포인터로 배열 접근




2 차원 배열을 가진 포인터 (3)

다음 코드를 고려하십시오.

#include <stdio.h>
#define ROW_SIZE 2
#define COL_SIZE 2

int main()
{
   int a[ROW_SIZE][COL_SIZE]={{1,2},{3,4}};

   // Base address:Pointer to the first element a 1D array
   printf("Base address of array:%p\n",a);

   //The value at the base address: should be the address of 1st 1D array
   printf("Value at the Base address:%p\n",*a);

   return 0;
}

획득 된 결과 :

Sample Output:
Base address of array:0xbff77434
Value at the Base address:0xbff77434

어떻게 든 2D 배열의 기본 주소 개념을 이해하지 못하고 기본 주소의 값이 1D 배열에 대한 주소를 동일하게 이해하는 데 실패했습니다. 설명 해주십시오.


나는 당신의 산출물의 형식이 당신을 던지고 있다고 생각한다. 맞습니다. 첫 번째 배열 요소 (0xbff77434)의 주소가 값 (1)과 다릅니다. % p는 "포인터"형식을 강제로 사용하려고 혼란을 겪고 있습니다.

그리고 네, 칼도 정확합니다.

첫 번째 요소가 무엇인지 알아 보려면 다음 중 하나를 말하십시오.

printf("%i", a[0][0]);

int* p = &a[0][0];    // point 'p' to the beginning of 'a'
// (or)
int* p = a;           // saying "&a[0][0]" is the same as saying "a"
printf("%i", *p);     // here, the dereference is what you want

1D 대 2D 배열까지는 해석의 문제 일뿐입니다. 양자 모두

int x[4];

int x[2][2];

4 'int 크기의'요소로 이루어진 연속적인 블록을 생성하십시오. 그리고 두 경우 모두 표현식 'x'는 0 번째 항목의 주소 (예 : 배열의 주소)를 나타냅니다.


배열은 포인터가 아니며 C에서는 다차원 배열이 배열의 배열 일뿐입니다. 많은 컨텍스트에서 배열의 이름을 사용하면 해당 배열의 첫 번째 요소에 대한 포인터가 "붕괴"됩니다. 그게 당신의 인쇄 진술에서 모두 일어납니다. 첫 번째 경우 :

printf("Base address of array:%p\n",a);

a 는 배열의 첫 번째 요소에 대한 포인터, 즉 배열의 첫 번째 행에 대한 포인터가됩니다. 귀하의 경우에는 int (*)[2] 유형의 포인터를 얻는다는 의미입니다.

두 번째 경우 :

printf("Value at the Base address:%p\n",*a);

동일한 부식이 발생하지만 그 포인터를 역 참조하십시오. 즉, 첫 번째 행에 대한 int (*)[2] 포인터를 역 참조하여 배열을 다시 남겨 둡니다 (첫 번째 행). 이 배열 자체 첫 번째 요소에 대한 포인터로 붕괴되어 결과로 나오는 int * 포인터 (첫 번째 행의 첫 번째 요소까지)를 제공합니다.

두 경우 모두 주소가 동일합니다. 그 이유는 배열이 메모리에 배치되는 방식이기 때문입니다. 우리의 2D 배열이 주소 0 에서 시작되었다고한다면, 다음과 같이 보일 것입니다 (4 바이트 int 타입을 가정).

 Address       Value
    0            1
    4            2
    8            3
   12            4

첫 번째 행의 주소와 첫 번째 행의 첫 번째 요소의 주소는 모두 0 입니다.


a[2][2] 차원 배열 a[2][2] 는 4 원소로 구성된 일차원 배열로 볼 수 있습니다. int* 포인터로 캐스팅 할 때 어떤 일이 일어날 지 생각해보십시오.

int a[2][2] = {{ 1, 2 }, { 3, 4 }};
int* p = (int*) a; // == { 1, 2, 3, 4 }

assert(a[1][0] == p[2] == 3); // true

int* a0 = a[0];  // the first row in the bidimensional array
int* p0 = &p[0]; // the first element in the monodimensional array

assert(*a0 == *p0 == 1); // true

// Or the long version:
assert(a[0][0] == *a0 == a0[0] == p[0] == *p0 == p0[0] == 1); // true

// And for the second array in a:
int* a1 = a[1]; // the second row in the bidimensional array
int p2 = &p[2]; // the third element in the monodimensional array

assert(a[1][0] == *a1 == a1[0] == p[2] == *p2 == p2[0] == 3); // true

배열 aa[0] 기본적으로 동일한 주소를 가리 킵니다. 그러나 형식은 조작 할 수있는 방법에 대한 정보를 전달합니다.







multidimensional-array