为什么int arrayp []与int * arrayp作为函数的参数相同?

问题描述 投票:0回答:2

为什么会int arrayp[]int* arrayp相同,作为函数定义/声明中的参数?

 int* foo(int arrayp[]){}

指向在调用方中作为参数传递的int数组的第一个元素的指针。

赞:

 #include <stdio.h>

 int* foo (int arrayp[]);

 int main(void)
 {
    int a[] = { 10,5,4,2,1 };
    int *p;

    p = foo(a);

    printf("%d",*p);

    return 0;
 }

 int* foo(int arrayp[])
 {
     *arrayp = 0;
     return arrayp;          
 }

为什么int arrayp[]指向类型为int的数组的第一个元素的指针?恕我直言,我认为这非常令人困惑。某些人可能认为他们使用此表达式传递了整个数组(按值传递)。

c arrays pointers parameter-passing pass-by-reference
2个回答
2
投票

在函数参数类型中,最里面的数组被隐式调整为指针类型。

因此,这些函数声明对例如是兼容的:

void foo(int a[]);
void foo(int *a);  //compatible declaration

void bar(int a[][2][3]);
void bar(int (*a)[2][3]);  //compatible declaration

[Dennis Ritchie(语言作者)在https://www.bell-labs.com/usr/dmr/www/chist.html中解释了此令人困惑的规则

此外,一些旨在简化早期过渡的规则有助于以后混乱。例如,函数声明

int f(a)int a []; {...}是一种活化石,是NB遗留的方式声明一个指针;仅在这种特殊情况下,a被解释为在C中作为指针。这种符号之所以幸存,部分原因是兼容性,部分是在允许的合理化条件下程序员与读者交流通过f a的意图从数组生成的指针,而不是对单个引用的引用整数。不幸的是,它足以使学习者感到困惑提醒读者。

((注:Chist.html使用K&R样式函数定义。上述函数定义的原型等同于int f( int a[]){ ... }。]

简而言之,存在该规则主要是为了简化从B到C的过渡,并允许程序员向读者发送信号,期望指向数组的第一个元素的指针,而不仅仅是指向单个元素的指针。] >

函数类型的参数也以类似的方式衰减到指针。

void takeFuncPtr(void Func(void));
void takeFuncPtr(void (*Func)(void)); //compatible declaration

1
投票

很难明确地回答“为什么”问题。在C语言中,数组/指针对偶性在各处使用。一旦习惯了,它似乎就不会令人困惑。

© www.soinside.com 2019 - 2024. All rights reserved.