为什么C中指向数组的指针的大小总是8?

为什么C中指向数组的指针的大小总是8?,c,arrays,pointers,C,Arrays,Pointers,下面是比较数组本身大小和指向数组的指针大小的简单代码 #include <stdio.h> int main(){ int kkarray[100]= {1,0,}; int (*kkpointer) = kkarray; printf("size of array using array itself : %ld \n" , sizeof(kkarray)); printf("size

下面是比较数组本身大小和指向数组的指针大小的简单代码

#include <stdio.h>    
int main(){   
        int kkarray[100]= {1,0,};
        int (*kkpointer) = kkarray;

        printf("size of array using array itself : %ld \n" , sizeof(kkarray));        
        printf("size of array using pointer to array : %ld \n" , sizeof(kkpointer));   
}
我可以理解第一个值是400,但是第二个值,我认为它也应该是400,因为当我分配一个指向数组的指针,kkpointer时,它有点像数组的名称,它是常量地址值。例如,我可以使用kkpointer[0]获取数组的第一个值。 我想知道为什么我得到的是“8”而不是400。 我不认为“8”是地址本身的大小。
请让我知道。谢谢

在您的平台上,任何指针的大小总是
8
,因此它取决于平台

sizeof
操作符不关心指针指向哪里,它给出指针的大小,在第一种情况下,它只给出数组的大小,这是不同的

这是对N1570草案第6.5.3.4节的引用

sizeof运算符生成其操作数的大小(以字节为单位),该操作数可以是 表达式或类型的括号名称大小由类型决定 操作数。结果是一个整数。如果操作数的类型是可变长度数组 类型,则计算操作数;否则,不计算操作数,结果为 整型常数

§6.5.3.4^4

当sizeof应用于具有char、unsigned char或 带符号字符(或其限定版本)结果为1当应用于 具有数组类型的操作数,当 应用于具有结构或并集类型的操作数,结果为 此类对象中的字节,包括内部填充和尾部填充


如您所见,当应用于数组时,它给出了总字节数。但是如果您传递一个指针,那么结果将是它的类型的大小

sizeof
不是一个函数-它是在编译时计算的。它给出了指针本身的大小—它不关心指针指向的对象。@JonathonReinhart幸运的是,它不关心指针对象,否则它就没用了。@JonathonReinhart:第一部分你说得对,它不是函数(它不可能是函数,而且它做什么都可以)。但它是在编译时计算的。除非不是,这只发生在VLA(类型或变量)上。@Deduplicator gahh我知道。想一件事,打另一件!谢谢你指出<代码>它是32位系统中的4位。@al Acme为什么会让您感到惊讶?它不必是32位系统中的4位。基本上,指针的大小取决于实现所说的大小。@juanchopanza我刚刚记得
x32
linux.IIRC,x32在x86-64上以长模式使用32位指针。
400
8