You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言新手疑问:为何不能将变量改为指针直接传入函数

C语言指针新手疑问:为啥不能直接用空指针替代取地址?

我是C语言新手,对指针的工作原理不太清楚。第一个示例的运行结果符合预期:a和b被修改为1,而c保持不变。代码如下:

void pointers_and_variables(int *a, int *b, int c) {
    a[0] = 1;
    b[0] = 1;
    c = 1;
}
int main() {
    int a = 0;
    int b = 0;
    int c = 0;
    pointers_and_variables(&a,&b,c);
    printf("a:%d b:%d c:%d", a,b,c);
    return 0;
}

我不理解的是,为何不能将main函数中的int a = 0; int b = 0; int c = 0; pointers_and_variables(&a,&b,c);修改为int *a = 0; int *b = 0; int c = 0; pointers_and_variables(a,b,c);

别急,咱们一点点拆解这个问题,核心是搞懂指针变量和**取地址运算符&**的本质区别:

  • 先看原来的正确写法:int a = 0;定义的是普通整型变量,它在内存里有专属的存储空间,存着数值0。&a是取这个变量的内存地址,把地址传给函数的int *a参数——这里的int *a是指针变量,作用就是存储另一个整型变量的地址。函数里的a[0] = 1等价于*a = 1,意思是“找到指针指向的内存地址,把1写进去”,所以原变量a会被修改。

  • 再看你想改的写法:int *a = 0;定义的是指针变量,但你给它赋值0,在C语言里这是空指针,不指向任何有效内存空间。把空指针传给函数后,执行a[0] = 1时,本质是往空指针指向的无效地址写数据(通常是内存地址0,属于操作系统保护区域),程序会直接崩溃或触发未定义行为。

  • 要是真想用指针变量传参,得先让它指向有效的整型变量,比如:

    int main() {
        int real_a = 0;
        int real_b = 0;
        int c = 0;
        int *a = &real_a; // 让指针a指向real_a的内存地址
        int *b = &real_b; // 让指针b指向real_b的内存地址
        pointers_and_variables(a, b, c);
        printf("a:%d b:%d c:%d", real_a, real_b, c);
        return 0;
    }
    

    这样就能正常运行,因为此时指针a和b指向的是有效的内存空间。

总结来说:指针变量只是个“地址容器”,你得先给它装一个有效的内存地址(指向已存在的变量),它才能正常干活。直接把指针初始化为0,相当于给了它一个无效地址,用它写数据肯定出问题。

内容的提问来源于stack exchange,提问作者Adam Rörhr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:37:29