数组和指针

时间:2011-11-18 03:39:12

标签: c++ arrays pointers

int array[10] = {1,2,3,4,5,6,7,8};
int *ptr = array;
std::cout<<*(ptr+ 2); => O/P = 3

int (*arr_ptr)[10] = &array;
std::cout<<*(*arr_ptr+2); => O/P = 3

这两者之间的区别是什么2.我知道它们的意思,但如果它们给出相同的结果,为什么我们有2种不同的符号?

4 个答案:

答案 0 :(得分:3)

第一种情况是正常情况:ptr是指向数组array的第一个元素的指针,并且它被索引(使用*(ptr+2),这是{的同义词{1}})访问该数组的第三个元素。

第二种情况是人为的:ptr[2]是指向(enitre)数组arr_ptr的指针。它首先被解除引用(使用array)来生成数组本身,然后将其用作二进制*arr_ptr的参数,这会导致它被隐式转换为指向其第一个元素的(无名称)指针,然后以相同的方式+索引,并给出相同的结果。

将这些隐式转换显式化,您可以编写

*(<nameless pointer>+2)

答案 1 :(得分:1)

编辑完问题后,以下是不同之处:

(1) int *ptr = array;

array被衰减到指针。理想情况下,ptr可以指向任何int[],无论其大小

(2) int (*arr_ptr)[10] = &array;

arr_ptr是指向int[10]的指针。这是非常具体的定义,您永远不能将数组分配给arr_ptr,其大小不是10

int array_2[20];
arr_ptr = &array_2; // error

答案 2 :(得分:0)

使用您理解且符合问题域的符号。如果您的应用有数组,则使用数组表示法。如果由于其他原因必须推送指针,那么第二个版本是合适的。

答案 3 :(得分:0)

它们实际上与编译器不同,并且会导致生成不同的汇编语言。

以下是对差异的一些很好的参考:http://cplusplus.com/forum/articles/10/