Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是C';如果丢弃长度数据,是否使用数组语法?_C_Arrays_Syntax - Fatal编程技术网

什么';这是C';如果丢弃长度数据,是否使用数组语法?

什么';这是C';如果丢弃长度数据,是否使用数组语法?,c,arrays,syntax,C,Arrays,Syntax,下面是一个示例程序: #include <stdio.h> void foo(int b[]){ printf("sizeof in foo: %i\n", sizeof b); } int main(){ int a[4]; printf("sizeof in main: %i\n", sizeof a); foo(a); } 问题是,如果它只是转换成函数边界处的标准指针,那么这种语法有什么意义 这是语法上的甜点:voidfoo(intb[])

下面是一个示例程序:

#include <stdio.h>

void foo(int b[]){
    printf("sizeof in foo: %i\n", sizeof b);
}

int main(){
    int a[4];
    printf("sizeof in main: %i\n", sizeof a);
    foo(a);
}
问题是,如果它只是转换成函数边界处的标准指针,那么这种语法有什么意义

  • 这是语法上的甜点:
    voidfoo(intb[])
    表明
    b
    将被用作数组(而不是单独的参数),即使它实际上是一个指针

  • 它是从postfix
    []
    中遗留下来的,postfix是指针声明的语法

  • 问题是,如果它只是转换成函数边界处的标准指针,那么这种语法有什么意义

    在本例中,因为您将数组作为参数传递,所以C创建了一个指向给定地址的指针——然而,真正有趣的情况是,当您在堆栈上分配数组并仅在堆栈上使用它时会发生什么

    当您执行此操作时,编译器会将该数组的load语句转换为直接访问堆栈基+偏移量,而不是指针加偏移量-为什么不呢?无论如何,存储指针是没有意义的

    但是,在传递数组时,编译器将数组的基地址作为指针传递给函数


    简而言之,
    []
    可以帮助您更好地完成指针运算。在声明数组的情况下,可以对其进行优化-这就是为什么数组不是指针,尽管它们在某些情况下(而不是在其他情况下)是通过指针访问的。

    @Mehrdad:不一定。语法糖会导致分号癌。@larsmans你们想到的是合成语法糖@拉斯曼:对不起,我是指你的评论。我是在开玩笑。@SanJacinto:没听懂这个笑话,我的坏:)谢谢,我只是觉得现在的编译器可能会更聪明一点,而且实际上会传递额外的信息(因为在本例中,sizeof是在编译时计算的)。但是,如果没有smart标准,就不能使用smart编译器:/You know,如果您提前知道大小,您可以声明
    void foo(int b[4])
    。@Kevin这没有任何区别,您仍然可以将长度不是4的数组传递给
    foo
    。如果只允许长度为4的数组
    foo
    必须是
    void foo(int(*b)[4])
    sizeof in main: 16
    sizeof in foo: 8