gpt4 book ai didi

c - 数组大小说明

转载 作者:太空狗 更新时间:2023-10-29 17:01:38 25 4
gpt4 key购买 nike

我正在学习 C 语言的期末考试,并且有一个关于 sizeof 运算符的问题。

假设 int 的大小是 32 位,而指针是 64 位。

如果有函数:

int
foo (int zap[])
{
int a = sizeof(zap);
return a;
}

因为 zap 是一个指针,foo 将返回 8,因为这是存储该特定指针所需的字节数。但是,使用以下代码:

int zip[] = { 0, 1, 2, 3, 4, 5 };
int i = sizeof(zip);

i 将是 6 * sizeof(int) = 6 * 4 = 24

为什么 sizeof(zip) 返回元素数乘以每个元素的大小,而 sizeof(zap) 返回指针的大小?是不是zap的大小未指定,而zip不是?编译器知道 zip6 元素,但不知道zap 可能有多大是。

最佳答案

这是 C 语法中的一种不对称。在 C 语言中,不可能将数组传递给函数,因此当您在函数声明中为其中一个参数使用数组语法时,编译器会将其作为指针读取。

在 C 中,大多数情况下,当您在表达式中使用数组时,数组会隐式转换为指向其第一个元素的指针,这正是您调用函数时发生的情况。在以下代码中:

int bar[] = {1,2,3,4};
foo(bar);

数组被转换为指向第一个元素的指针,这就是函数接收的内容。

然而,这种隐式转换规则并不总是适用。正如您所发现的,例如 sizeof 运算符适用于数组,甚至 & (address-of)运算符也适用于原始数组(即 sizeof(*&bar ) == 4*sizeof(int)).

C 中的函数不能接收数组作为参数,它只能接收指向第一个元素的指针,或指向数组的指针...或者您必须将数组包装在结构中。

即使你在函数声明中的括号之间放了一个数字...

void foo(int x[4])
{
...
}

编译器完全忽略了这个数字...编译器的声明完全等同于

void foo(int *x)
{
...
}

例如,即使调用它传递一个不同大小的数组也不会触发任何错误...

int tooshort[] = {1,2,3};
foo(tooshort); /* Legal, even if probably wrong */

(实际上编译器可能给出警告,但代码是完全合法的 C 并且如果编译器遵循标准则必须被接受)

如果您认为函数参数中关于数组的这条规则很奇怪,那么我同意,但这就是 C 语言的定义方式。

关于c - 数组大小说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com