指向数组的指针不指向数组的第一个元素

时间:2015-08-18 12:54:37

标签: 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 不会在处打印< / em>地址。

3 个答案:

答案 0 :(得分:4)

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

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

当您将操作符<<传递给数组的解除引用指针时,它会获得指向该数组的第一个元素的指针。在数字上,它是相同的指针,但它仍然是一个指针。这就是003CFB2C被打印的原因。

请注意,表达式*(*ptr2+1)不会增加太多值,因为*的优先级高于+1已添加到取消引用 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的数组,即{5, 6},它的第一个derefnerence产生数组本身及其第二个取消引用会在初始位置生成值。

答案 1 :(得分:2)

int (*ptr2)[2]=&arr2;这是一个指向数组的指针。

ptr2是指向数组的指针。打印时,会得到指向的地址(数组的地址)。

*ptr2是数组本身。每当在表达式中使用数组时,它就会衰减为指向第一个元素的指针。当您将指针打印到第一个元素时,您将获得第一个元素的地址。这也是数组的地址。

**ptr2首先取消引用数组指针并获取数组。数组衰减成指向第一个元素的指针。然后将指针的内容带到第一个元素,因此打印出第一个元素。

答案 2 :(得分:0)

*ptr2正在打印arr的地址,ptr2是指向数组的指针。