以下代码显示指向数组第一个元素的指针。 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>地址。
答案 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
是指向数组的指针。