为了账号安全,请及时绑定邮箱和手机立即绑定

2d数组是双指针吗?

2d数组是双指针吗?

C
尚方宝剑之说 2019-06-21 13:10:45
2d数组是双指针吗?int main(){     matrix[2][4] = {{11,22,33,99},{44,55,66,110}};     int **ptr = (int**)matrix;     printf("%d%d",**matrix,*ptr);}但是,当二维数组作为参数传递时,它被输入到(*矩阵)[2]中。编译器将这个数组存储为.它是存储为二维数组还是双指针或指向数组的指针。如果它是作为数组存储的,那么在上面这样的不同情况下,它是如何进行不同的解释的。请帮我理解。
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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将意味着一个指针值存储在矩阵的地址,但没有任何指针值。第二,没有指向matrix[1]程序记忆中的任何地方。

注:本文中的计算假设sizeof(int)==1,以避免不必要的复杂性。


查看完整回答
反对 回复 2019-06-21
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

没有。多维数组是单个内存块。块的大小是维度的乘积,乘以元素类型的大小,并在每对括号中对其余维度的尺寸乘积将偏移值索引到数组中。所以.。

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

是一个包含30的数组。intS.arr[0][0][0]给出第一个,arr[1][0][0]给出第七(偏移3*2)。arr[0][1][0]给出第三个(偏移2)。

数组衰减到的指针将取决于级别;arr衰变到指向3x2 int数组的指针,arr[0]衰变到指向2元素int数组的指针,arr[0][0]衰减到指向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.


查看完整回答
反对 回复 2019-06-21
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

在C语言中,没有什么特别的东西需要你去理解多维数组。他们的工作方式完全一样,就好像他们从来没有被特别提到过一样。您需要知道的是,您可以创建任何类型的数组,包括数组。

所以当你看到:

[2][4];

想想看,“matrix是一个由两个事物组成的数组-这些东西是由4个整数组成的数组“。适用于数组的所有正常规则。例如,matrix可以很容易地衰减为指向其第一个成员的指针,就像任何其他数组一样,在这种情况下,这是一个由四个整数组成的数组。(当然,它本身也会腐烂。)


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 442 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信