繁体   English   中英

C:指向2d数组的指针

[英]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应该始终指向第一个元素所在的地址,而不管存储块有多长。

请解释为什么我的推理不起作用,因为我很难完全理解它。 谢谢。

Bint数组的数组。 它不是指针,因此不指向任何内容。 但是,在大多数情况下, 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]

B3 int2数组的数组。 在表达式中使用时,在大多数情况下,数组会转换为指向第一个元素的指针。 表达

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

这里也一样。 BB[0]B[0][0]都相同,但是三个的类型都不同。

C语言中的“指针”不仅仅是表示(虚拟)内存地址的基础数字,还带有数据类型。

在您的情况下, B的类型为int[2][3] 你不能分配给int*比你能一个分配任何更多charchar*

在幕后, B显然是第一个元素的地址,并且您可以通过强制转换向编译器表达这就是您要说的:

int *p = *B;

或使用完整的类型擦除:

int *p = (int *)(void *)B;

请注意,这些都没有实际发出任何代码(除调试代码外)。 您只是在重新解释仅编译类型。

暂无
暂无

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

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