鱼C论坛

 找回密码
 立即注册
查看: 825|回复: 7

[已解决]指向一维数组元素的指针

[复制链接]
发表于 2020-8-11 20:36:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

我的问题:方式2:这里s+=a[i];定义了指针*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[5]={1,2,3,4,5};
    printf("sum=%d",fun(b,5));
}
最佳答案
2020-8-12 01:46:05
(1) 用 a[i] 这样的形式对数组进行访问总是会被编译器改写成(或者说解释为)像 *(a+i) 这样的指针形式。

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

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

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-11 20:38:36 | 显示全部楼层
在函数中数组自动降级为指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 20:45:27 | 显示全部楼层
这就是两种方式,让我们能更好理解代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 20:52:52 | 显示全部楼层
这里s+=a[\i];定义了指针*a;为什么可以变成数组a[]呢
指针和数组都可以使用下标的哦,为了方便

或者把代码改为如下
int fun(int a[],int n)
改成这样和第一段并无区别,在函数参数中的数组本质即为指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 22:30:09 | 显示全部楼层
int类型的指针指向一个存放int类型变量的地址,a+1是表示该指针的地址向后移动sizeof(*a),这里不是移动sizeof(a),可以看下面代码,改变的是指针所指向的地址,而指针本身地址不变
批注 2020-08-11 222829.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 22:35:55 | 显示全部楼层
[]符号对指针操作时是下标运算的意思,用于取指针所指向目标的值这样应该理解了吧。
正是因为指针有了[]操作,才有了数组这一数据类型的存在。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-12 01:46:05 | 显示全部楼层    本楼为最佳答案   
(1) 用 a[i] 这样的形式对数组进行访问总是会被编译器改写成(或者说解释为)像 *(a+i) 这样的指针形式。

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

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

(4) 当希望向函数传递数组时,可以把函数参数定义为数组形式(可以指定长度也可以不指定长度),也可以定义为指针。不管哪种形式,在函数内部都要作为指针变量对待。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

更多内容可以参考我弄懂这个问题的文章
https://stackoverflow.com/questions/21120863/what-is-the-difference-between-a-and-a-in-function-parameter
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表