数组和指针
Array and 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
这两个有什么不同?我知道它们的意思,但如果它们给出相同的结果为什么我们有两种不同的符号?
第一种情况是正常情况:ptr
是指向数组array
的第一个元素的指针,并且它被索引(使用*(ptr+2)
,它是ptr[2]
的同义词)访问该数组的第三个元素。
第二种情况是人为的:arr_ptr
是指向(整体)数组array
的指针。首先对其解引用(使用*arr_ptr
)以生成数组本身,然后将其用作二进制+
的参数,这导致它被隐式转换为指向其第一个元素的(无名)指针,然后以相同的方式对*(<nameless pointer>+2)
进行索引,并给出相同的结果。
使这些隐式转换显式,您可以写
int *ptr = &array[0];
std::cout<<*(ptr+ 2);
int (*arr_ptr)[10] = &array;
std::cout<<*( &(*arr_ptr)[0] + 2 );
修改你的问题后,以下是不同之处:
(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
使用您理解并且适合问题域的符号。如果你的应用有一个数组,那么使用数组表示法。如果由于其他原因需要对指针进行push操作,那么第二个版本比较合适。
对于编译器来说,它们实际上是不一样的,并且会导致生成不同的汇编语言。
这里有一些关于差异的很好的参考:http://cplusplus.com/forum/articles/10/
相关文章:
- 指向指向字符数组的指针数组的指针
- 通过指向指针数组的指针访问子类的属性
- C++,指针数组,指向双链表中的条目
- 在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)
- C++从函数指针数组调用函数
- 关于指向指针数组的指针
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 将链表转换为指针数组时出错
- C++ 对象指针数组的复制构造函数
- C++ - 循环访问指针数组会导致错误
- 删除指针数组 (C++) 中的元素
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将函数指针数组中的函数指针作为模板参数传递
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 具有推导参数的模板函数指针数组变量
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- C++指针数组到字符数组中的特定位置
- 如何在C++中复制指针数组的数据
- 初始化类中的指针数组,并在另一个类中检索它
- 尽管直接设置了指针数组,但仍为空