类型,表达式和数组维度

时间:2017-12-07 11:10:34

标签: c arrays pointers operators

我将答案改为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_of。在这一点上,我是否正确地认为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]。这是对的吗?

感谢您与我分享您的知识和经验!

2 个答案:

答案 0 :(得分:2)

简言之:

1)sizeof(s) = 27:字符串的长度,包括NUL-terminator。请注意,标准sizeof(char)为1。

2)sizeof(p) = 8:系统中char*的大小。

3)sizeof(a) = 12:在main中,是的,数组中元素的数量乘以每个元素的大小。由此我们可以推断出sizeof(int)是4。

4)sizeof(d) = 40sizeof(double)乘以元素数量。

在函数f中,传递的数组衰减到指针类型。最有可能sizeof(a)为8.标准坚持 sizeof(char*)sizeof(int*)相同,但我从未遇到过桌面PC情况并非如此。

答案 1 :(得分:1)

很多文字,我没有读过,但这是我的回答:

char s[] = "deep in the heart of texas";   // sizeof = length of string + 1
char *p  = "deep in the heart of texas";   // sizeof is size of pointer = 8
int a[3];                                  // size of 3 ints
double d[5];                               // size of 5 doubles

并在f中,您正确地将其声明为获取指针,因此其大小是指针的大小。

这就是......