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

C语言如何解引用指针?传递指针参数出现编译警告问题求解

指针解引用基础说明

指针是存储内存地址的变量,解引用操作符*的作用是访问指针指向的内存地址中存储的实际数据。示例:

int num = 18;
int *p = # // p存储变量num的内存地址
int val = *p; // 解引用p,拿到地址里存储的实际值18

如果直接使用指针变量名本身,操作的是内存地址值,不是地址里存的实际数据。

警告原因解析

第二处警告(根源问题)

warning: assignment to ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
30 | age = atoi(digits);
你在main中把age定义为int *类型(整数指针),但atoi的返回值是int类型的实际年龄数值,直接把数值赋值给指针相当于把年龄值当成内存地址写入指针变量,逻辑完全错误。
修复方案:把main中的age改为普通int变量存储年龄值,调用函数时传入变量的地址即可。

第一处警告

warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ [-Wformat=]
9 | printf("Happy Birthday %s, you are now %d", name,age );
printf的%d占位符要求传入int类型的实际数值,但你传入的age是int *类型的指针(内存地址),需要用*age解引用拿到指针指向的实际年龄值才能正常输出。

额外逻辑问题说明

你happyBirthday函数中的年龄自增逻辑也有错误:

int * newAge = age;
age = (newAge)++;

这段代码操作的是指针本身的地址值,不是指针指向的年龄数据,想要给年龄加1需要对指针解引用后操作:(*age)++,不需要额外定义newAge变量。

修复后的完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void happyBirthday(char * name, int * age){
    // 解引用后给年龄加1
    (*age)++;
    // 解引用拿到实际年龄值输出
    printf("Happy Birthday %s, you are now %d", name, *age );
}

int main() {
    char buffer[32];
    char digits[4]; // 扩容避免两位数加换行符越界

    printf("Enter name:");
    fgets(buffer,32,stdin);
    // 去掉fgets读取的末尾换行符
    buffer[strcspn(buffer, "\n")] = '\0';

    printf("Enter age:");
    fgets(digits,4,stdin);

    char *name = buffer;
    // age改为普通int变量
    int age = atoi(digits);

    // 传入age的地址
    happyBirthday(name, &age);

    return 0;
}

内容的提问来源于stack exchange,提问作者AMCode96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:00:03