[英]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
整数。
这些表达式: multi
, multi[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.