C 和 C++ 中的指针
Posted
技术标签:
【中文标题】C 和 C++ 中的指针【英文标题】:Pointers in C and C++ 【发布时间】:2017-01-22 19:46:23 【问题描述】:我正在探索 C 和 C++ 中 指针 的概念。我已经阅读了很多关于它的文章,但我仍然有一些疑问。期待你们中的任何人都可以清除它们。
所以这是我的问题:
这样声明的一维数组:
int array[5] = 1, 2, 3, 4, 5;
现在我正在打印以下值:
printf("array--->%u", array); // Output: 3199709072
printf("&array--->%u", &array); // Output: 3199709072
printf("*array--->%d", *array); // Output: 1
printf("*&array--->%d", *&array); // Output: 3199709072
前三个输出与我的预期相同,但我不明白第四个。
为什么要打印数组第一个元素的地址??
我正在使用*&array
表达式,这意味着我明确指定我想要&array
地址的值,但它仍然打印第一个元素的地址。
有什么想法吗??
【问题讨论】:
您的代码会为某些调用调用未定义的行为。printf
需要一个整数并且您传递指针。最后一个:为什么你期望一个数组是一个指针,虽然它显然被称为“数组”而不是“指针”?
旁白:请使用格式说明符%p
作为指针,并将指针参数转换为(void*)...
@Olaf 好吧,我没有将此代码与本机 c 或 c++ 编译器一起使用,而是与 android NDK 一起使用。为了简单起见,我使用 %d ,它给了我类似 3199709072 而不是 0xbeb7af90 的东西。
@Vikalp 希望我的回答对您有所帮助!谢谢
那如何改变你调用 UB 的代码?
【参考方案1】:
当一元 *
和一元 &
结合在一起时,它们会相互抵消。 *&array
等价于 array
。由于数组在作为参数传递给函数时衰减到指向其第一个元素的指针,array
将给出数组array
的第一个元素的地址。
换个角度看,表达式*&array
会被解析为(* (&array) )
;检索数组array
的地址,然后取消引用它。由于&array
是一个数组的地址,取消引用它将返回数组本身,但根据规则,取消引用的数组将衰减为指向其第一个元素的指针,它将使表达式*&array
等效于array
.
注意:使用%p
说明符来打印地址。喜欢
printf("array--->%p", (void *)array);
否则,使用错误的说明符将引发未定义的行为。
【讨论】:
我们将不胜感激评论拒绝投票的原因。【参考方案2】:改为使用 %p 来获取内存中的指针地址。您的代码将生成未定义的行为。只需使用以下示例。
printf("%p \n",pointer);
//where pointer is array in your case
应该可以。
【讨论】:
以上是关于C 和 C++ 中的指针的主要内容,如果未能解决你的问题,请参考以下文章