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++ 中的指针的主要内容,如果未能解决你的问题,请参考以下文章

c 和 c++ 中的指针之间有啥大的区别吗? [关闭]

C++ this 指针,函数调用中的隐藏参数

C++ 中的指针成员 ->* 和 .* 运算符是啥?

C ++中的指针和引用之间是不是存在任何开销差异[重复]

Java的引用c++的引用和C指针的区别

C++中的函数指针和函数对象总结