我知道当我们在数组名称上使用 sizeof
运算符时,它会给出数组的总大小(以字节为单位)。例如
int main(int argc, const char * argv[]) {
int a[][5] = {
{1,2,3,4,5},
{10,20,30,40,50},
{100,200,300,400,500}
};
int n=sizeof(a);
printf("%d\n",n);
}
它为数组的 15 个元素
提供 60
作为输出。但是当我写
int n=sizeof(*a);
它给出 20
作为第一行大小的输出,而 *a
是 0th
元素的基地址0th
行,它的类型是一个指向整数的指针。 a
指向第一行本身。为什么会这样?
最佳答案
*a
是 a
的第 0 行,该行是一个包含五个 int
的数组。
在大多数表达式中,数组会自动转换为指向其第一个元素的指针。因此,当您在诸如 int *x = *a;
的语句中使用 *a
时,*a
将转换为指向它的指针第一个元素。这导致指向 int
的指针,可以将其分配给 x
。
但是,当数组是 sizeof
运算符、一元 &
运算符或 _Alignof_
运算符的操作数时,它不是转换为指向其第一个元素的指针。此外,用于初始化数组的字符串文字数组不会转换为指针(因此,在 char foo[] = "abc";
中,"abc"
用作数组来初始化 foo
;它不会转换为指针)。
关于c - C 中 sizeof 运算符中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51478342/