[英]C: pointer to 2d array
据我了解:
int B[2][3];
int* p=B;
不起作用,因为B不是指向int的指针,而是指向3个int数组的指针。 但这与B仍指向数组中的第一个元素int的事实并不矛盾。 那么,为什么* p或* B不包含B [0] [0]的值?
怎样才能有一个指向“整数数组”的指针? 指针只能指向内存中的单个地址,而不能指向所有3个地址。 因此,B应该始终指向第一个元素所在的地址,而不管存储块有多长。
请解释为什么我的推理不起作用,因为我很难完全理解它。 谢谢。
B
是int
数组的数组。 它不是指针,因此不指向任何内容。 但是,在大多数情况下, B
出现在代码中时, B
会自动转换为指向数组第一个元素的指针。 该元素不是int
,而是3 int
的数组。
怎样才能有一个指向“整数数组”的指针? 指针只能指向内存中的单个地址,而不能指向所有3个地址。
您不妨问一下如何获得指向int
的指针。 在我所知道的每个C系统中, int
都比一个字节宽,但是字节是可单独寻址的。 那么,当其中的各个字节具有单独的地址时,如何指向一个int
? 当然,对于int
和数组,答案是相同的:整个对象的地址就是其第一个字节的地址。
因此,B应该始终指向第一个元素所在的地址,而不管存储块有多长。
确实如此,但是根据指针所指向的数据类型来解释指针。 指向不同数据类型的指针甚至可以用不同的方式表示。 鉴于您的声明...
int B[2][3];
...表达式*B
的结果为3个int
的数组,特别是B[0]
。 这与B[0][0]
之处在于int
的第一个字节与整个int
相同。 特别地, (*B)[1]
是B[0][1]
一个完全有效的替代表达式。
那么,为什么
*p
或*B
不包含B[0][0]
?
B
是3
int
的2
数组的数组。 在表达式中使用时,在大多数情况下,数组会转换为指向第一个元素的指针。 表达
int *p = B;
B
被转换为指向其第一个元素的指针。 B
第一个元素是2个int
的数组,即B[0]
。 因此, B
被转换为指向B[0]
指针。
取消引用指针会产生该指针指向的数据类型的值。 在这种情况下B
指向B[0]
,类型为3 int
s 。 因此, *B
产生3个int
s的数组,而不是int
数据( B[0][0]
)。
怎样才能有一个指向“整数数组”的指针?
任何数据类型都可以具有指针。 数组也是数据类型,可以具有指针。
指针只能指向内存中的单个地址,而不能指向所有3个地址。
我给你一个现实的例子来解释这一点。
您有一间名为B
的房子,其中有3
房间。 你家的地址是House no. 18, Steet x
House no. 18, Steet x
。 如果有人问您第一个房间的地址是什么,那么您的答案将与B
房的地址相同。 尽管您的房间和房子的地址相同,但是House!= Room 。
这里也一样。 B
, B[0]
和B[0][0]
都相同,但是三个的类型都不同。
C语言中的“指针”不仅仅是表示(虚拟)内存地址的基础数字,还带有数据类型。
在您的情况下, B
的类型为int[2][3]
。 你不能分配给int*
比你能一个分配任何更多char
的char*
。
在幕后, B
显然是第一个元素的地址,并且您可以通过强制转换向编译器表达这就是您要说的:
int *p = *B;
或使用完整的类型擦除:
int *p = (int *)(void *)B;
请注意,这些都没有实际发出任何代码(除调试代码外)。 您只是在重新解释仅编译类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.