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种不同的符号?
答案 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/