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

