sourcetip

2d 배열은 이중 포인터입니까?

fileupload 2023. 7. 2. 20:55
반응형

2d 배열은 이중 포인터입니까?

int main()
{
    matrix[2][4] = {{11,22,33,99},{44,55,66,110}};
    int **ptr = (int**)matrix;
    printf("%d%d",**matrix,*ptr);
}

그러나 2-d 배열이 매개 변수로 전달되면 컴파일러는 이 배열을 어떤 유형으로 저장합니까?2-D 배열 또는 이중 포인터 또는 배열에 대한 포인터로 저장합니다.어레이로 저장하는 경우 위와 같은 다양한 상황에서 어떻게 다르게 해석합니까?제가 이해할 수 있도록 도와주세요.

2d 배열은 이중 포인터입니까?

아닙니다. 프로그램의 다음 행이 잘못되었습니다.

int **ptr = (int**)matrix;

이 답변은 동일한 주제를 다룹니다.

다차원 배열이 구현되는 방법에 대한 구체적인 이미지를 원하는 경우:

다차원 배열에 대한 규칙은 일반 배열에 대한 규칙과 다르지 않으며 "내부" 배열 유형을 요소 유형으로 대체합니다.배열 항목은 서로 바로 다음에 메모리에 저장됩니다.

matrix: 11 22 33 99 44 55 66 110
        -----------               the first element of matrix
                    ------------  the second element of matrix

따라서 요소를 .matrix[x][y]당신이 가져가세요the base address of matrix + x*4 + y(4는 내부 배열 크기입니다.)

배열이 함수로 전달되면 배열은 첫 번째 요소에 대한 포인터로 감쇠합니다.은 당이알렸듯이차, 은것이아입니다.int (*)[4].4그런 다음 유형에서 컴파일러에게 내부 유형의 크기를 알려줍니다. 이것이 작동하는 이유입니다.유사한 포인터에서 포인터 연산을 수행할 때 컴파일러는 요소 크기의 배수를 추가합니다.matrix_ptr[x][y]은 신은당을 얻습니다.matrix_ptr + x*4 + y그것은 위와 정확히 같습니다.

ptr=(int**)matrix따라서 부정확합니다.이번 한 번만.*ptr매트릭스 주소에 저장된 포인터 값을 의미하지만 없습니다.▁pointer다없▁secondly니에 대한 포인터가 없습니다.matrix[1]그 프로그램의 기억 속 어디든.

이은 참고: 게이의계다가음다정니합을산은물시다▁note가니ations▁in▁assume합정▁calcul참을 가정합니다.sizeof(int)==1불필요한 복잡성을 방지할 수 있습니다.

아닙니다. 다차원 배열은 메모리의 단일 블록입니다.블록 크기는 치수에 요소 유형의 크기를 곱한 값이며, 각 브래킷 쌍의 인덱싱은 나머지 치수에 대한 치수의 곱을 기준으로 배열로 오프셋됩니다.그래서..

int arr[5][3][2];

는 3030도를 입니다.intarr[0][0][0]첫 번째를 주고,arr[1][0][0] * 2).7번째 값을 제공합니다(3 * 2로 표시). arr[0][1][0]세 번째 값(2로 표시)을 제공합니다.

배열이 붕괴되는 포인터는 수준에 따라 달라집니다.arr 배열, 3x2 int 열의포붕괴터로 합니다.arr[0]는 2 int 배열에 하고, 는 int.2 "int"에 대한 포인터로 합니다.

그러나 포인터 배열을 사용하여 다차원 배열로 처리할 수도 있지만, 각 포인터를 해당 배열로 설정해야 하기 때문에 추가 설정이 필요합니다.됩니다.sizeof는 포인터의 크기를 제공합니다.반면에 다른 크기의 하위 배열을 사용하고 포인터가 가리키는 위치를 변경할 수 있으므로 크기를 조정하거나 재배치해야 할 경우 유용합니다.될 수 . 할당과 배열이 다르더라도sizeof항상 똑같이 행동하지는 않을 것입니다.정적으로 할당된 이 설정의 예는 다음과 같습니다.

int *arr[3];
int aa[2] = { 10, 11 }, 
    ab[2] = { 12, 13 }, 
    ac[2] = { 14, 15 };
arr[0] = aa;
arr[1] = ab;
arr[2] = ac;

위와 같은 일이 있은 후,arr[1][0]이라12하지만 그것을 주는 대신에.int에서 발견된.1 * 2 * sizeof(int) 수 배 주 를 나 지 서 트 이 바arr그것은 그것을 줍니다.int에서 발견된.0 * sizeof(int) 가 키 는지바이수트서나가 가리키는 주소를 수arr[1]. . .sizeof(arr[0])는 와동합다니등다에 합니다.sizeof(int *)sizeof(int) * 2.

C에서는 다차원 배열을 이해하기 위해 특별히 알아야 할 것이 없습니다.그들은 구체적으로 언급된 적이 없는 것처럼 정확히 같은 방식으로 작동합니다.어레이를 포함하여 모든 유형의 어레이를 생성할 수 있습니다.

그래서 당신이 볼 때:

int 행렬[2][4];

" 해봐각생▁","matrix는 2개의 사물의 배열입니다. 대한 모든 일반적인 규칙이 적용됩니다어레이에 대한 모든 일반 규칙이 적용됩니다.를 들면, 들면를예,matrix다른 배열과 마찬가지로 첫 번째 멤버에 대한 포인터로 쉽게 붕괴할 수 있으며, 이 경우에는 4개의 정수로 이루어진 배열입니다.

해당 데이터(작은 볼륨)에 스택을 사용할 수 있는 경우 일반적으로 행렬을 정의합니다.

int matrix[X][Y]

힙(큰 볼륨)에 할당하려는 경우 일반적으로 다음을 정의합니다.

int** matrix = NULL;

그런 다음 malloc/calloc으로 2차원을 할당합니다.2d 배열을 int**로 처리할 수 있지만 코드 판독성이 떨어지기 때문에 이 방법은 좋은 방법이 아닙니다.그 외에는

**matrix == matrix[0][0] is true

언급URL : https://stackoverflow.com/questions/7586702/is-2d-array-a-double-pointer

반응형