波大大12138 发表于 2020-8-11 20:36:03

指向一维数组元素的指针

函数功能:求出长度为n的数组b的所有元素的和
int fun(int *a,int n)
{
    int i,s=0;
    for(i=0;i<n;i++)
    {
       s+=*(a+i);//方式1
       s+=a;    //方式2
    }
    return s;
}
main()
{
    int b={1,2,3,4,5};
    printf("sum=%d",fun(b,5));
}

我的问题:方式2:这里s+=a;定义了指针*a;为什么可以变成数组a[]呢,为什么不区分呢,或者把代码改为如下
int fun(int a[],int n)
{
    int i,s=0;
    for(i=0;i<n;i++)
    {
       s+=*(a+i);//方式2
   
    }
    return s;
}
main()
{
    int b={1,2,3,4,5};
    printf("sum=%d",fun(b,5));
}

zltzlt 发表于 2020-8-11 20:38:36

在函数中数组自动降级为指针。

livcui 发表于 2020-8-11 20:45:27

这就是两种方式,让我们能更好理解代码

永恒的蓝色梦想 发表于 2020-8-11 20:52:52

这里s+=a[\i];定义了指针*a;为什么可以变成数组a[]呢指针和数组都可以使用下标的哦,为了方便
或者把代码改为如下
int fun(int a[],int n)改成这样和第一段并无区别,在函数参数中的数组本质即为指针。

疏月 发表于 2020-8-11 22:30:09

int类型的指针指向一个存放int类型变量的地址,a+1是表示该指针的地址向后移动sizeof(*a),这里不是移动sizeof(a),可以看下面代码,改变的是指针所指向的地址,而指针本身地址不变

xiaozhangxuexi 发表于 2020-8-11 22:35:55

[]符号对指针操作时是下标运算的意思,用于取指针所指向目标的值这样应该理解了吧。
正是因为指针有了[]操作,才有了数组这一数据类型的存在。

风过无痕1989 发表于 2020-8-12 01:46:05

(1) 用 a 这样的形式对数组进行访问总是会被编译器改写成(或者说解释为)像 *(a+i) 这样的指针形式。

(2) 指针始终是指针,它绝不可以改写成数组。你可以用下标形式访问指针,一般都是指针作为函数参数时,而且你知道实际传递给函数的是一个数组。

(3) 在特定的环境中,当数组作为函数形参时,也只有这种情况,一个数组可以看做是一个指针。作为函数形参的数组始终会被编译器修改成指向数组第一个元素的指针。

(4) 当希望向函数传递数组时,可以把函数参数定义为数组形式(可以指定长度也可以不指定长度),也可以定义为指针。不管哪种形式,在函数内部都要作为指针变量对待。

Justin1 发表于 2020-8-12 08:03:37

int fun(int *a,int n)
int fun(int a[],int n)
这个问题,我以前没有细想过,参考了别人的一些资料,说说我的理解。
对于这两个代码,你要明白这个函数里面传的是什么。无论是int *a还是int a[]传的都是一个地址!!!地址,地址,敲重点
小甲鱼在课上可是强调了很多次了数组名实质上就是数组第一个元素的地址。既然是地址,那我这两个不都是一样的吗?{:10_256:}

更多内容可以参考我弄懂这个问题的文章
https://stackoverflow.com/questions/21120863/what-is-the-difference-between-a-and-a-in-function-parameter
页: [1]
查看完整版本: 指向一维数组元素的指针