c中的指针和地址[重复]

zpqajqem  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(155)
    • 此问题在此处已有答案**:

How come an array's address is equal to its value in C?(6个答案)
2天前关闭。
我在一个c代码中操作一些指针,我发现了一些我不能理解的东西。

int main(){
   int tab[]={4,6,8,9,20};
   printf("%p %p",tab,&tab);
   return 0;
}

我试着打印变量tab和它的地址,知道tab保存了数组中第一个元素的地址,tab的地址本身是一个随机地址值,但是不管什么原因,程序输出了相同的值,我发现这很奇怪,所以如果有人能给我解释一下原因,我会很感激。

62o28rlo

62o28rlo1#

如果我们画出数组和指向它的公共指针,它看起来像这样:

+--------+--------+--------+--------+--------+
| tab[0] | tab[1] | tab[2] | tab[3] | tab[4] |
+--------+--------+--------+--------+--------+
^
|
&tab
|
&tab[0]

指针&tab&tab[0](普通的tabdecay 指向的是tab)都指向同一个位置。
但类型不同:&tab是指向数组的指针,并且将具有类型int (*)[5],而&tab[0]是指向单个int元素的指针,因此具有类型int *

ubof19bj

ubof19bj2#

当你声明数组时

int tab[]={4,6,8,9,20};

编译器为5个数组元素的数组tab保留了内存。它将衰减为“int指针”类型的表达式,表达式的值将是数组制表符第一个元素的第一个地址。这就是tab数组存储基址&tab[0]的原因
这就是tabtab[0]具有相同输出的原因。
换句话说,

printf("%p",tab);

相当于

printf("%p",&tab[0]);

相关问题