c++ - 指向数组的指针是否指向数组的第一个元素

标签 c++ arrays pointers

下面的代码显示了一个指向数组第一个元素的指针。 ptr 显示它指向的地址,而 *ptr 打印地址处的值,这是预期的。

int arr[]={1,2};
int *ptr=arr; //same as int *ptr=&arr[0]
cout<<"\n\n";
cout<<"Value at "<<ptr<<"is "<<*ptr<<endl;

输出:

Value at 003CFB48is 1

在下面的代码中,指针指向一个包含 2 个元素的数组(而不是特别指向数组的一个元素)。但在这种情况下,取消引用指针会打印地址。 ptr2 打印地址那么为什么*ptr2 打印地址处的值呢?

int arr2[]={3,4};
int (*ptr2)[2]=&arr2;
cout<<"Value at "<<ptr2<<"is "<<*ptr2<<endl; //Isnt *ptr2 supposed to print value at ptr?
cout<<"1st element is "<<**ptr2<<" and second is "<<*(*ptr2+1);

输出:

Value at 003CFB2Cis 003CFB2C
1st element is 3 and second is 4

编辑: 如果 ptr 打印一个地址,*ptr 打印一些值,**ptr 打印第一个元素(除了我会然后发布了一个不同的问题:)) 我知道这里的 ptr2 指向一个数组而不是第一个元素,所以我可能需要使用 **ptr2 来打印第一个元素。 这里的真正问题是,如果 ptr2 指向一些 地址,那么从语法上讲,为什么 *ptr2 不打印 that< 处的值/em> 地址。

最佳答案

虽然两个指针的数值相同,但是它们类型的不同使得解引用返回不同的东西:

  • 取消引用指向 int 的指针返回 int , 而
  • 取消引用指向 int 的指针两个元素的数组返回 int两个元素的数组。

当您传递运算符 << 时指向数组的取消引用指针,它获得指向该数组第一个元素的指针。在数值上,它是同一个指针,但它仍然是一个指针。这就是为什么 003CFB2C打印出来。

请注意表达式 *(*ptr2+1)没有增加多少值(value),因为 *优先级高于 + . 1 sis 添加到一个取消引用 ptr2 ,它的行为类似于指向 int 的指针.

正在尝试打印 *(*(ptr2+1)) , 但是,将是未定义的行为,因为它会指向 arr2 的末尾。 .这是一种演示添加 1 时会发生什么的方法。指向数组的指针:

int arr2[2][2]={{3,4},{5,6}};
int (*ptr2)[2]=&arr2[0];
cout<<"Value at "<<ptr2<<"is "<<*ptr2<<endl; //Isnt *ptr2 supposed to print value at ptr?
cout<<"1st element is "<<**ptr2<<" and second is "<<*(*(ptr2+1));

现在1st element is 3 and second is 5被打印( demo ),因为 ptr2+1指向下一个数组 int s,即 {5, 6} ,它的第一个解引用产生数组本身,它的第二个解引用产生初始位置的值。

关于c++ - 指向数组的指针是否指向数组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32073036/

相关文章:

arrays - 用常量(不是文字)作为维度说明符声明数组

c - C双指针(矩阵)的基本问题

c++ - 将 shared_ptr 转换为常规指针

C++ 使用命名空间语句

javascript数组比较循环多次

c++ - 使用 OpenGL 绘制点数组

具有自定义对象的 C++ 数组

C - 堆上的缓冲区在 EXEC 后不会丢失,而是保存在堆栈上

c++ - std::tuple 存储的垃圾值

c++ - 与外部库链接时出现 GCC "multiple definition"错误