【发布时间】:2018-05-21 11:34:16
【问题描述】:
我在similar question 上回复了这个问题,该问题得到了广泛而直接的讨论。我想确定我给他们的解释是正确的。
例如,我的textbook 在练习 6.24 中指出,“sizeof 运算符可用于查找存储类型或表达式所需的字节数。当应用于数组时,它不会产生数组的大小。”
#include<stdio.h>
void f(int *a);
int main(){
char s[] = "deep in the heart of texas";
char *p = "deep in the heart of texas";
int a[3];
double d[5];
printf("%s%d\n%s%d\n%s%d\n%s%d\n",
"sizeof(s) = ", sizeof(s),
"sizeof(p) = ", sizeof(p),
"sizeof(a) = ", sizeof(a),
"sizeof(d) = ", sizeof(d));
f(a);
return 0;
}
void f(int *a){
printf("In f(): sizeof(a) = %d\n", sizeof(a));
}
即便如此,它对我来说似乎并不那么明显。因此,我想与您简要讨论一下输出:
sizeof(s) = 27
sizeof(p) = 8
sizeof(a) = 12
sizeof(d) = 40
In f(): sizeof(a) = 8
然后:
sizeof(s) = 27
在这种情况下,27 是由s 组成的字节数,每个char 由一个字节组成。这与sizeof 的定义形成对比,因为它返回的似乎是数组的_size_。在这一点上,我认为char s[] = "deep in the heart of texas" 被视为表达式是否正确?
sizeof(p) = 8
在这里,我们有一个指针char *。由于 sizeof “查找存储类型所需的字节数”,我假设指针 char * 存储在 8 个字节的内存中。我说的对吗?
sizeof(a) = 12 and In f(): sizeof(a) = 8
这个案子让我特别不确定。我发现的唯一相关区别是,在 f() 中,数组 a 作为 parameter 传递:指向其基址的指针。和以前一样,指针存储在 8 个字节的内存中。我对么?如果是这样,12 必须被认为是存储表达式int a[3] 所需的内存量?
sizeof(d) = 40
同样,它似乎返回数组d 的维度,即每个8 字节的五个部分。但是,同样,我们不是在讨论数组,而是在考虑表达式double d[5]。对吗?
感谢您与我分享您的知识和经验!
【问题讨论】:
-
我不认为该问题与您建议的问题重复。原因是他们没有表现出太多的研究努力,也没有谈论表达,就我而言,这是一个相关的论点。也许我错了。在这种情况下,我想确保下次做得更好。任何建议将不胜感激。
-
“当应用于数组时,它不会产生数组的大小”——通常当有人谈论数组的“大小”时,他们指的是数组中元素的数量。有了这个理解,这个陈述是正确的。对于
char的数组,恰好数组的大小也是存储数组所需的字节数,但对于其他类型则不必如此。 -
@DavidBowling 这是一个宝贵的守时,谢谢!
标签: c arrays pointers operators