pra*_*kar 3 c c++ compiler-construction gcc icc
朋友我刚刚玩了一些指针程序,并意识到GCC(可能是C标准)区分静态和动态数组.
动态数组具有用于数组中元素地址的占位符,而对于静态数组,没有存储器位置,其中编译器存储元素数组的起始地址.
我有一个示例程序来证明我的困惑.
#include <iostream>
#int main(void)
{
int _static[10];
int *_dynamic;
_dynamic = new int [10];
std::cout<<"_static="<<_static<<" &_static="<<&_static<<" &_static[0]="<<&_static[0]<<std::endl;
std::cout<<"_dynamic="<<_dynamic<<" &_dynamic="<<&_dynamic<<" &_dynamic[0]="<<&_dynamic[0]<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于上面的程序,_static
并&_static[0]
在预期的行上返回相同的地址.但是,&_static
也返回与其他两个相同的地址.
所以,_static
并&_static
参考相同的数字(或地址,无论我们想称之为什么).正如所料,_dynamic
并&_dynamic
指出不同的位置.
那么,为什么C标准会说_static
并且&_static
必须引用相同的位置.这听起来令人困惑.我觉得的一个原因是&_static
没有多大意义.但那么它的使用不应该被报告为错误吗?
有人可以帮我解决这个困惑吗?
函数内的静态数组在堆栈上分配.这种方式_static
(作为指向第一个条目的指针衰减),&_static[0]
并&_static
具有相同的值,相同的内存地址.
另一方面,动态数组实际上是指向连续存储区的指针.只有指针存储在堆栈中.这就是&_dynamic
(来自堆栈)和_dynamic
(来自堆)不同的原因.
希望这张图片显示一切:
还要看一下这篇关于静态和动态全局数组继续与非的区别的文章extern
extern
.