下面的代码显示了一个指向数组第一个元素的指针。 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/