为什么C允许我们将2D数组视为1D? [关闭]

问题描述 投票:-5回答:3

这里,我仅使用一个循环就可以访问2D数组的元素。因此,看来我不需要将这个数组作为2D进行学习。

#include <stdio.h>
#include <process.h>

main()
{
    int array[][3] = {11, 22, 33, 44, 55, 66, 77, 88, 99};

    int * pArr = &array;
    int i=0;

    printf("Addr\tValue\n");
    for(i=0 ; i<9 ; i++)
    {
        printf("%d\t%d\n", &pArr[i], pArr[i]);
    }

    system("PAUSE");
}

输出

Addr    Value
2358344 11
2358348 22
2358352 33
2358356 44
2358360 55
2358364 66
2358368 77
2358372 88
2358376 99

为什么C允许我们这样做?

“在此处输入图像描述”

c pointers
3个回答
2
投票

取决于您的意思。这是一种可能的解释:

int x[5][10];  // 2D array
int (*p)[5][10] = &x;  // Pointer to 2D array

(*p)[3][2] = 1;  // Dereferencing pointer

这是另一个:

int x[5*10];  // 1D array
int *p = x;   // Pointer to first element of array

p[3*10+2] = 1;  // Dereferencing pointer

这是另一个:

int **p;    // Pointer to pointer
p = malloc(sizeof(*p) * 5);  // Create array of pointers
for (int i = 0; i < 5; i++)
{
    p[i] = malloc(sizeof(p[i]) * 10);  // Create array of ints
}

p[3][2] = 1;  // Dereferencing pointer

...

// Clearup
for (int i = 0; i < 5; i++)
{
    free(p[i]);
}
free(p);

0
投票
int **pointer;

指针保存int *个元素的集合的第一个元素的地址。

第一个元素是int *指针。

该元素可能指向实际的int

因此,指针指向指针集合的第一个元素,其中第一个元素指向一个int。如果将pointer加1,则会得到下一个可能指向int的指针

这是C指针算术中“ 2D”的含义。


0
投票

您不能;指针只会告诉您要看哪里,而不是目标是什么。

以此示例2D数组:

1 2 3 4
5 6 7 8
9 0 1 2

这将在内存中表示为

1 2 3 4 5 6 7 8 9 0 1 2

仅当您知道这是一个int[3][4]时,您才能再次获得该数组。 C不存储它是int[2][6]还是int[3][4]

[If您知道数组的尺寸,这很容易,因为您可以简单地分配它。

© www.soinside.com 2019 - 2024. All rights reserved.