C语言中如何打印结构体指针成员指向的值并将obj->id指向整型变量
问题解决:结构体指针的取值与赋值
没问题,我来帮你理清这两个问题,直接上解决方案和细节解释:
一、打印obj.id指向的值
你之前用printf("%p\n", obj.id)输出的是指针本身存储的内存地址(也就是obj.id这个指针变量的值),而要获取它指向的整型数据,必须用**解引用操作符***来访问指针指向的内存内容:
printf("%d\n", *obj.id);
这里要注意运算符优先级:.(成员访问)的优先级比*(解引用)更高,所以obj.id会先被求值得到指针,再通过*拿到它指向的整数。
你之前直接用printf("%d\n", obj.id)出现警告,是因为%d期望接收一个int类型的参数,但obj.id是int*(整型指针)类型,类型完全不匹配——直接传指针本身是在传地址值,而不是地址里存储的整数,所以必须通过解引用转换类型。
二、让obj.id指向某个整型变量
假设你有一个普通整型变量int num = 10;,只需要把这个变量的内存地址赋值给obj.id即可,用取地址操作符&:
int num = 10; obj.id = # // 将num的地址赋值给obj.id,此时obj.id就指向num的内存空间了
完成赋值后,*obj.id就等价于num,修改其中一个的值,另一个也会同步变化。
完整可运行代码示例
#include <stdio.h> struct c { int *id; int type; } obj; int main() { // 让obj.id指向整型变量num int num = 42; obj.id = # // 打印指针指向的整型值 printf("obj.id指向的值:%d\n", *obj.id); // 打印指针本身存储的地址(标准写法是转成void*避免编译器警告) printf("obj.id存储的内存地址:%p\n", (void*)obj.id); return 0; }
额外注意事项
- 一定要确保
obj.id指向有效的内存后再解引用,如果它是NULL或者野指针(指向未分配/已释放的内存),直接解引用会导致程序崩溃或触发未定义行为。 - 使用
%p打印指针地址时,C语言标准要求参数是void*类型,所以最好显式转换(void*)obj.id,避免部分编译器抛出警告。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

