c++ - c/c++ 中的指针

标签 c++ c

#include <stdio.h>

void main()  
{  
   int p[]={0,1,2,3,4};  
   int *a[]={p,p+1,p+2,p+3,p+4};  
   printf("%u %u %u",a,*a,*(*a));  
}

*(*a) 会打印什么(它会打印 0 还是它的地址)? 如果我们将数组 p 设为静态(static int p[]),输出会发生变化。为什么?

最佳答案

首先,我认为你的意思是 3%u 而不是 4。 其次,您不应该关心前 2 个输出:a 和 *a,因为它们是操作系统分配的地址。

现在回答你的问题,在第一种情况下,当你不使用static时,数据的代码空间分配在堆栈上,操作系统使用随机化技术,为了安全起见改变变量的地址.这就是为什么 a 和 *a 的输出不断变化的原因。 但是,一旦您将 p 声明为静态,它就会分配到数据区域中,操作系统不会随机化,因此您会得到 *a 输出作为常量。但是,a still 是非静态的,因此每次运行程序时它的输出都会改变,因为它仍然分配在堆栈上。 我希望这回答了你的问题。

如果你的意思是在第一种情况下 a 和 *a 非常接近而在第二种情况下它们不是,我的回答也回答了这一点。

关于c++ - c/c++ 中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2963719/

相关文章:

c++ - std::valarray 的 operator* 有什么问题?

c - 十六进制数组和十六进制文字的区别

c - libuv 简单的 echo 客户端

c++ - 将 C 中的按位语句转换为 Delphi

c++ - 使用 token 和特权的程序

c++ - 如何在 C++20 中为模板别名创建推导指南?

c - 为什么需要在 C 中用 * 定义对指针的引用?

c++ - 快速排除成员是否在集合中

c - 在某个重复字符后从字符串中删除文本

c++ - 在我的 MacOS 应用程序中禁用 "Show Help Menu"快捷方式