programing

C에서 2차원 배열의 요소에 액세스하기 위해 포인터 표현을 사용하는 방법은 무엇입니까?

randomtip 2023. 8. 29. 22:22
반응형

C에서 2차원 배열의 요소에 액세스하기 위해 포인터 표현을 사용하는 방법은 무엇입니까?

배열의 경우 1차원 배열로 알고 .x=a[i]는 와동합다니등다에 합니다.x=*(a+i)포인터를 사용하여 2차원 배열의 요소에 액세스하려면 어떻게 해야 합니까?

요약:다음과 같이 정의된 다차원 배열이 있는 경우int [][],그리고나서x = y[a][b]는 와동합다니등다에 합니다.x = *((int *)y + a * NUMBER_OF_COLUMNS + b);


보링 세부 정보:

(int *)y위의 내용은 처음에는 직관적이지 않을 수 있기 때문에 설명할 가치가 있습니다.이러한 기능이 필요한 이유를 이해하려면 다음을 고려해야 합니다.

  1. C/C++의 입력 포인터 산술은 스칼라로 추가/감산/증분/감산할 때 항상 입력 포인터 값(주소)을 바이트 단위의 유형 크기로 조정합니다.

  2. 다차원 배열 선언의 기본 유형(요소 유형이 아니라 변수 유형)은 최종 차원보다 1 작은 차원의 배열 유형입니다.

이 중 후자(#2)는 굳히기 위한 예가 필요합니다. 다서변수는에음는▁variables변▁in수▁thear1그리고.ar2동등한 선언입니다.

int ar1[5][5]; // an array of 5 rows of 5 ints.

typedef int Int5Array[5];  // type is an array of 5 ints
Int5Array ar2[5];          // an array of 5 Int5Arrays.

이제 포인터 연산 부분입니다.입력된 구조 포인터가 구조의 크기(바이트)만큼 전진할 수 있듯이 배열의 전체 차원도 호핑될 수 있습니다.위에서 ar2를 선언한 것처럼 다차원 배열을 생각하면 이를 이해하기가 더 쉽습니다.

int (*arptr)[5] = ar1; // first row, address of ar1[0][0].
++arptr;               // second row, address of ar[1][0].

이 모든 것은 맨 포인터로 해결됩니다.

int *ptr = ar1; // first row, address of ar1[0][0].
++ptr;          // first row, address of ar1[0][1].

따라서, 2차원 배열에 대한 포인터 산술을 할 때, 다음은 요소를 얻는 데 효과적이지 않을 것입니다.[2][2]다중 세그먼트 배열의 경우:

#define NUMBER_OF_COLUMNS   5
int y[5][NUMBER_OF_COLUMNS];
int x = *(y + 2 * NUMBER_OF_COLUMNS + 2); // WRONG

그 이유는 바라건대 당신이 기억할 때 명백합니다.y는 배열의 배열입니다(비교적으로).스케일러를 추가하는 포인터 산술(2*5 + 2)y12개의 행을 추가할 것이며, 따라서 계산 및 주소는 다음과 같습니다.&(y[12])이것은 분명히 옳지 않으며, 사실 컴파일 시에 중대한 경고를 던지거나 완전히 컴파일에 실패할 것입니다.▁of의 으로 피할 수 .(int*)y그리고 맨 포인터-투-인트를 기반으로 하는 식의 결과 유형:

#define NUMBER_OF_COLUMNS   5
int y[5][NUMBER_OF_COLUMNS];
int x = *((int *)y + 2 * NUMBER_OF_COLUMNS + 2); // Right!

테이블

C에서 2D 어레이는 연속적인 일련의 라인입니다(파스칼과는 다릅니다).
때: 4행 5열의 정수표는 다음과 .A 5*4 integer table.

요소에 도달

다음을 통해 요소에 도달할 수 있습니다.

int element = table[row-1][column-1];

그러나 다음 코드로도 이 작업을 수행할 수 있습니다.

int element = *(*(table+row-1)+column-1);

예제에서는 이예서는에는▁inrow그리고.column부터 계산되며, 1의 입니다. -1 의 이유입니다.
다음 코드에서 두 매개 변수가 모두 올바른지 테스트할 수 있습니다.에는 00부터 0까지의 합니다.

#include <stdio.h>
#include <stdlib.h>
#define HEIGHT 4
#define WIDTH 5

int main()
{
    int table[HEIGHT][WIDTH] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
    int row = 2;
    int column = 2;
    int a = *(*(table+row)+column);
    printf("%d\n",a);//13
    printf("%d\n",table[row][column]);//13
    return 0;
}

설명.

이은이포산다술이, 서래그더인중것▁this,ithmetic.table첫 번째 행을 가리키는 점과*table첫 번째 요소를 가리키는 점, 만약 당신이 그것을 더 이상 언급하지 않는다면.**table첫 번째 요소의 값을 반환합니다.다음 예제에서는 다음을 확인할 수 있습니다.*table그리고.table동일한 메모리 주소를 가리키고 있습니다.

printf("%d\n",table);//2293476
printf("%d\n",*table);//2293476
printf("%d\n",**table);//1

메모리에서 테이블의 모든 행이 서로를 따르고 있습니다. ㅠㅠtable테이블에서 필요한 요소가 있는 행 번호를 추가하면 첫 번째 행을 가리키는 포인터를 얻을 수 있습니다. 이우경*(table+row)지정된 행의 첫 번째 요소에 대한 주소를 포함합니다.는 이제다같열이번추됩가니다면하호를과음과 같은 열 .*(table+row)+column그리고 우리는 주어진 행과 열에 있는 원소의 주소를 얻습니다.만약 우리가 이것을 더 이상 언급하지 않는다면, 우리는 이 요소의 정확한 값을 얻게 됩니다.
따라서 행과 열을 0부터 계산하면 다음과 같은 요소를 테이블에서 가져올 수 있습니다.

int element = *(*(table+row)+column);

기억 속에서

The table in the memory.

2D 배열은 1D 배열의 배열로 간주됩니다.각배열입니다.즉, 2D 배열은 1D 배열입니다. 배열 따라서 2D 주니다집어가 .A,

int A[m][n].

일반적으로,

A[i][j] = *(A[i]+j) 

또한.

A[i] = *(A+i)

그렇게,

A[i][j] = *(A[i]+j) = * ( *(A+i)+j).

앞의 답변들은 이미 매우 잘 설명되어 있어서, 나는 단지 내가 이해한 대로 포인터 표현을 나열하고 ar[i][j] 형식과 비교할 것입니다.

2-D 배열의 포인터 식:배열 이름 자체가 첫 번째 하위 배열에 대한 포인터입니다.
arr:첫 번째 서브의 첫 번째 요소가 아닌 첫 번째 서브 어레이에 대한 포인터가 될 것입니다.배열, 배열과 포인터의 관계에 따르면, 그것은 또한 나타냅니다.배열 자체,
arr+1:첫 번째 서브의 두 번째 요소가 아닌 두 번째 서브 어레이에 포인터가 됩니다.배열,
*(arr+1):두 번째 하위 배열의 첫 번째 요소에 포인터가 됩니다.배열과 포인터의 관계에 따르면, 그것은 또한 두 번째를 나타냅니다.하위 배열, arr[1]과 동일,
*(arr+1)+2:두 번째 하위 배열의 세 번째 요소로 포인터가 됩니다.
*(*(arr+1)+2):두 번째 하위 배열의 세 번째 요소 값을 가져옵니다.arr[1][2]동일,

2-D 배열과 마찬가지로 다중-D 배열의 표현식도 비슷합니다.

포인터로 액세스하는 실용적인 방법입니다.

typedef struct
{
    int  Array[13][2];
} t2DArray;

t2DArray TwoDArray =
{
   { {12,5},{4,8},{3,6},{7,9},{3,2},{3,3},{3,4},{3,5},{3,6},{3,7},{4,0},{5,0},{5,1} }
};

t2DArray *GetArray;

int main()
{
    GetArray = &TwoDArray;
    printf("\n %d\n %d\n %d\n %d\n %d\n %d\n",
    GetArray->Array[0][0], 
    GetArray->Array[0][1], 
    GetArray->Array[1][0], 
    GetArray->Array[1][1], 
    GetArray->Array[2][0], 
    GetArray->Array[2][1]);

    getchar();
    return 0;
}

나가.

12 5 4 8 3 6

#include <iostream>
using namespace std;

int main()
{
   //FOR 1-D ARRAY THROUGH ARRAY
   int brr[5]= {1,2,3,4,5};

   for(int i=0; i<5; i++)
   {
      cout<<"address ["<<i<<"] = "  <<&brr[i]<<" and value = "<<brr[i]<<endl;        
   }

   //FOR 1-D ARRAY THROUGH POINTER
   cout<<endl;  //  endl TO MAKE OUT PUT LOOK CLEAR AND COOL :)
   int (*q)=brr;

   for(int i=0; i<5; i++)
   {
      cout<<"address ["<<i<<"] = "  <<&brr[i]<<" and value = "<<*(q+i)<<endl; //(p[i][j])
   }

   cout<<endl;

   //FOR 2-D ARRAY THROUGH ARRAY        
   int arr[2][3] = {1,2,3,4,5,6};

   for(int i=0; i<2; i++)
   {
      for(int j=0; j<3; j++)
      {
         cout<<"address ["<<i<<"]["<<j<<"] = "  <<&arr[i][j]<<" and value = "<<arr[i][j]<<endl;
      }
   }

   //FOR 2-D ARRAY THROUGH POINTER        
   int (*p)[3]=arr; //  j value we give
   cout<<endl;

   for(int i=0; i<2; i++)
   {
      for(int j=0; j<3; j++)
      {
         cout<<"address ["<<i<<"]["<<j<<"] = "  <<(*(p+i)+j)<<" and value = "<<(*(*(p+i)+j))<<endl; //(p[i][j])
      }
   }
   return 0;
}

==============OUT PUT======================

//FOR 1-D ARRAY THROUGH ARRAY

address [0] = 0x28fed4 and value = 1
address [1] = 0x28fed8 and value = 2
address [2] = 0x28fedc and value = 3
address [3] = 0x28fee0 and value = 4
address [4] = 0x28fee4 and value = 5

//FOR 1-D ARRAY THROUGH POINTER

address [0] = 0x28fed4 and value = 1
address [1] = 0x28fed8 and value = 2
address [2] = 0x28fedc and value = 3
address [3] = 0x28fee0 and value = 4
address [4] = 0x28fee4 and value = 5

//FOR 2-D ARRAY THROUGH ARRAY

address [0][0] = 0x28fee8 and value = 1
address [0][1] = 0x28feec and value = 2
address [0][2] = 0x28fef0 and value = 3
address [1][0] = 0x28fef4 and value = 4
address [1][1] = 0x28fef8 and value = 5
address [1][2] = 0x28fefc and value = 6

//FOR 2-D ARRAY THROUGH POINTER

address [0][0] = 0x28fee8 and value = 1
address [0][1] = 0x28feec and value = 2
address [0][2] = 0x28fef0 and value = 3
address [1][0] = 0x28fef4 and value = 4
address [1][1] = 0x28fef8 and value = 5
address [1][2] = 0x28fefc and value = 6

언급URL : https://stackoverflow.com/questions/13554244/how-to-use-pointer-expressions-to-access-elements-of-a-two-dimensional-array-in

반응형