繁体   English   中英

多维数组:指针不指向自己的地址吗?

[英]Multidimensional arrays: don't the pointers point to their own addresses?

我是一名学习C的学生,试着把头脑包裹起来。

假设你有一些多维数组int multi[2][2] multi的值将是指向multi[0]地址的指针。 为简单起见,假设地址为1000.解除引用multi[0]提取另一个地址,这解决了multi[0][0]的地址。 取消引用,反过来,获取值(或者如果在左侧则返回分配地址。)

现在, multi + 1返回第二个指针的地址。 假设我们有4个字节的整数(其中每个嵌套数组有两个),因此multi + 1返回的地址将为1008.该地址将包含multi[1][0]的地址,该地址为1008 。

所以在这里我看到一个模式:这是不是意味着multi[0]multi[1]等中的地址包含指向自己地址的指针?

数组和指针是不同的。 这个主题在书中经常表现不佳。

int multi[2][2]的情况下,这是一个包含4个连续整数的块。 没有涉及指针。 C的类型系统将该块分成两个子阵列,每个子阵列包含2整数。

这些表达式: multimulti[0]表示数组。 当您使用表示数组的表达式时,在sizeof&之外的上下文中,将执行转换,并且该转换的结果是指向数组的第一个元素的指针。

这个指针是一个右值 ,即它与x + y具有相同的状态:它是你可以使用的值,但它不消耗任何存储空间(至少,它不存储为数组的一部分); 而你不能使用&运算符。

multi的值将是指向multi [0]地址的指针

如果在表达式中使用multi (数组),则将其转换为指向multi[0]的指针,其值为multi[0]的地址。 在表达式中使用时,数组总是转换为指向其第一个元素的指针...因此,C中的数组不是第一类对象,不能传递给函数(只有它们的地址可以)或赋值(使用memcpy )复制数组)。

解除引用multi [0]提取另一个地址,这解决了multi [0] [0]的地址

没有“提取”。 取消引用multi[0]产生一个数组,该数组将转换为指向其第一个元素的指针。 该指针的值是multi[0][0]的地址。 所有这些地址都具有相同的值,因为它们指向内存中完全相同的位置...四个int第一个。

现在,multi + 1返回第二个指针的地址。

同样, 内存中没有指针 multi + 1指的是一个数组...两个int的两个数组中的第二个。 在表达式中使用该数组转换为指向其第一个元素multi[1][0]的指针。

假设我们有4个字节的整数(每个嵌套数组有3个),因此multi + 1返回的地址为1012。

呃,你声明了int multi[2][2] ,这是两个数组,每个数组包含两个数组。 所以multi + 1是1008。

该地址将包含multi [1] [0]的地址,该地址为1012。

谈论包含地址的地址是没有意义的。 指针包含地址,但我们在内存中没有指针,我们只有int multi[1][0]是一个int ,它的地址是1008. multi[1]是一个int数组,它的地址也是1008 ...当然,因为它的地址与它的第一个地址相同元件。

所以在这里我看到一个模式:这是不是意味着multi [0],multi [1]等中的地址包含指向自己地址的指针?

multi[0]multi[1]中没有地址,有数组int s)。 数组地址,但在这种情况下,它们不包含地址。 “看模式”的方法是根据记忆中的内容来思考。 在这里,你只需要一个4个int的块 - 两个两个int的数组; 数组在C中没有开销或其他无关内容,它们只有数据......你声明的是你得到的。 数组是一个抽象 ,一个由其类型和大小决定的项目组,只存在于编译时和程序员的脑海中。 因此, multi[0]在C程序的抽象模型中包含一个数组 ,但是内存中的所有内容都是四个int ,前两个包含该数组。

情况会有所不同

int* multi[2];

你有一个两个指向int的数组; 每个指针都指向一个int数组(一旦你将它设置为int数组的地址,通常从malloc获得)。 一旦为子阵列分配存储器并分配两个指针,则可以使用此multi使用多方式multi的上方,但类型,大小和的存储器布局multi[0]multi[1]是在完全不同的这两个案子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM