鱼C论坛

 找回密码
 立即注册
查看: 2191|回复: 10

[已解决]指针作为函数参数

[复制链接]
发表于 2021-7-11 22:59:11 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
void getArr(int *p,int len)
{
        for (int i = 0; i < len; i++)
        {
                printf("%d\n", *p(i));//p指向数组的首地址,为什么不能解引用
                i++;
        }
}
int main(void)
{
        int arr[5] = { 1,2,4,5,1 };
        getArr(arr, 5);
        return 0;
}
最佳答案
2021-7-13 18:40:27
()优先级大于 *
()要么聚拢作用 要么表示函数
p()编译器会认为是个函数 肯定错了。

p[I] == *(p+i)   是个语法糖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-11 23:04:39 | 显示全部楼层
getArr函数第一个参数接受的是数组的首地址,为什么不能通过*(P+i)打印出数组的元素啊?为什么p[i]反而可以呢?p不是一个指针吗?指针应该通过括号而不是[]进行操作啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 07:54:27 | 显示全部楼层
数组不用解引用直接输出地址首地址就行了直接printf("%d\n", p【i】);还有为啥for里面有i++你外面还要i++我没看懂可能是你需要的吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 09:55:07 | 显示全部楼层
额,你的理解可能有些问题
要么用 p[i] 访问,要么用 *(p + i)
#include <stdio.h>
void getArr(int *p,int len)
{
    for (int i = 0; i < len; i++)
    {
        printf("%d\n", *(p + i));//p指向数组的首地址,为什么不能解引用
        i++;
    }
}
int main(void)
{
    int arr[5] = { 1,2,4,5,1 };
    getArr(arr, 5);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 11:46:31 | 显示全部楼层
说的对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-12 21:58:00 | 显示全部楼层
本帖最后由 wuxianbiao 于 2021-7-12 21:59 编辑
李现实 发表于 2021-7-12 07:54
数组不用解引用直接输出地址首地址就行了直接printf("%d\n", p【i】);还有为啥for里面有i++你外面还要i++我 ...


我意思是传进来的是数组首地址,p指向了这个地址,如果访问数组元素,应该是*p(i)。退一步说,数组不用解引用,那也应该是p(i),而不是p[i]。         (i++那个应该注释掉的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 22:07:29 | 显示全部楼层
wuxianbiao 发表于 2021-7-12 21:58
我意思是传进来的是数组首地址,p指向了这个地址,如果访问数组元素,应该是*p(i)。退一步说,数组不 ...

*p(i) 这个写法和数组没有关系,这是函数调用
#include <stdio.h>

int *p(int i) {
    static int ia = 10;
    static int ib = 100;
    if(i) return &ia;
    return &ib;
}

int main(void) {
    int i = 1;
    *p(i) = 123;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-12 22:22:42 | 显示全部楼层
人造人 发表于 2021-7-12 22:07
*p(i) 这个写法和数组没有关系,这是函数调用

调用函数应该是P(i)吧。你写的*p(i)是对ib进行解引用,返回的是ib的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-13 18:40:27 | 显示全部楼层    本楼为最佳答案   
()优先级大于 *
()要么聚拢作用 要么表示函数
p()编译器会认为是个函数 肯定错了。

p[I] == *(p+i)   是个语法糖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-13 19:16:59 | 显示全部楼层
wuxianbiao 发表于 2021-7-12 22:22
调用函数应该是P(i)吧。你写的*p(i)是对ib进行解引用,返回的是ib的值。

对呀,这是函数调用
调用函数 p 得到 ia 变量的地址
然后再用 * 进行解引用,得到 ia
你的问题是数组,*p(i) 是函数调用+对函数返回值解引用

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

使用道具 举报

 楼主| 发表于 2021-7-13 21:32:03 | 显示全部楼层
人造人 发表于 2021-7-13 19:16
对呀,这是函数调用
调用函数 p 得到 ia 变量的地址
然后再用 * 进行解引用,得到 ia

嗯嗯,我的程序里应该改成*(p+i)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 19:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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