c - 数组作为函数的参数

标签 c pointers

当一个数组作为参数传递时,编译器生成一个指向数组第一个元素的指针,并将该指针传递给函数而不是整个数组,所以我的问题是为什么我们可以打印数组的值我们打印 array[i]?

void FunctionApi(int array[])
{
    int i;
    for(i=0;i<8;i++)
    {
         printf("Value =%d\n",array[i]);
         //I understand the reason behind the following two lines but not the above          line.
         //printf("noOfElementsInArray=%d\n",*array);
         //*array++;
    }

}

int main()
{
    int array[8]={2,8,10,1,0,1,5,3};
    int noOfElementsInArray;
    noOfElementsInArray=sizeof(array)/sizeof(int); 
    printf("noOfElementsInArray=%d\n",noOfElementsInArray);
    FunctionApi(array);
    return 0;   

}

最佳答案

数组的元素一起存储在连续的位置。这就是为什么知道初始元素的地址就足以知道其余元素的位置。

唯一的诀窍是知道数组有多少个元素。这不与数组一起传递,因此您需要单独传递它。这对您的程序来说不是问题,因为您将它硬编码为 8,但通常如果您将数组作为参数传递,您还需要将其大小作为单独的参数传递:

void FunctionApi(int array[], size_t count) {
    int i;
    for(i=0;i<count;i++) {
        printf("Value =%d\n",array[i]);
    }
}

noOfElementsInArray=sizeof(array)/sizeof(int); 计算而言,这个技巧仅在调用者中有效,其中 array 是一个数组,不是指向数组初始元素的指针。在这个位置,编译器知道数组的大小是 int 大小的八倍,因此除以 sizeof(int) 可以得到元素的数量数组。

关于c - 数组作为函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14844028/

相关文章:

c - 如何在数组中的每个元素后面插入一个新元素?

c++ - 库 C 头文件在 Linux 上放在哪里

c - 需要帮助破译 C 语法

c - 'calloc' 不会自动消耗 RAM 中的内存

c - 指针 链表 C 编程

c - 在 memcpy 期间取消引用 void * 指针,想知道如何解决这个问题?

c - 在 C 中跟踪对象访问

c - 如何从 C 编写的源文件构建可执行文件?

c - 一字节指针在 C 中仍然有效吗?

c++ - 更改局部变量的地址