我相信我理解了如果你在使用C语言时,普通变量和指针在内存中的表示方式。
例如,很容易理解一个名为Ptr的指针将具有地址,并且它的值将是不同的地址,即它所指向的内存空间。以下代码:
int main(){
int x = 10;
int *Ptr;
Ptr = &x;
return 0;
}
在内存中会有以下表示:
+---------------------+-------------+---------+
| Variable Name | Address | Value |
+---------------------+-------------+---------+
| x | 3342 | 10 |
+---------------------+-------------+---------+
| Ptr | 5466 | 3342 |
+---------------------+-------------+---------+
然而,我发现很难理解数组在内存中的表示方式。例如,下面这段代码:
int main(){
int x[5];
x[0]=12;
x[1]=13;
x[2]=14;
printf("%p\n",(void*)x);
printf("%p\n",(void*)&x);
return 0;
}
这段代码输出了相同的地址两次(为了简单起见,是10568)。这意味着x==&x。但是*x(或使用数组符号表示的x[0])等于12,*(x+1)(或使用数组符号表示的x[1])等于13,以此类推。如何表示这个结果?一种方式可能是:
+---------------------+-------------+----------+----------------------+
| Variable Name | Address | Value | Value IF array |
+---------------------+-------------+----------+----------------------+
| x | 10568 | 10568 | 12 |
+---------------------+-------------+----------+----------------------+
| | 10572 | | 13 |
+---------------------+-------------+----------+----------------------+
| | 10576 | | 14 |
+---------------------+-------------+----------+----------------------+
| | 10580 | | trash |
+---------------------+-------------+----------+----------------------+
| | 10584 | | trash |
+---------------------+-------------+----------+----------------------+
这是否接近实际情况,或者完全错了?
x
和Ptr
的地址分得这么远?没有什么禁止实现这样做,但通常给定函数的自动变量都会靠近彼此,在“堆栈”上。 - Steve Jessop