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

char*与int*的解引用运算符(*)差异:为何访问值时int*需用*而char*无需?

为什么int需要解引用才能取值,char却不用?

这个问题其实是printf格式符的要求和C语言字符串的存储规则共同决定的,咱们一步步拆解来看:

1. 先搞懂printf的格式符需求

printf的每个格式符都对应特定类型的参数:

  • 当你用%s时,它期待的参数是一个char*(或者说指向字符串首字符的指针)。C语言里的字符串本质是以'\0'结尾的字符数组,char_ptr本身就是指向这个数组第一个字符的地址,printf拿到这个地址后,会自动从这里开始逐个读取字符,直到遇到终止符'\0'为止——所以直接传char_ptr完全符合%s的要求,根本不需要解引用。
  • 而当你用%d时,它期待的是一个int类型的数值。int_ptr是一个指针变量,它存储的是int值所在的内存地址,不是数值本身。如果直接把int_ptr传给%d,你打印出来的会是那个内存地址(转成int的数值),而不是你存在里面的31337。所以必须用*int_ptr解引用指针,拿到它指向的内存里的真实int数值,这样传给%d才是正确的。

2. 结合你的代码例子看

看你写的这段代码:

char *char_ptr; int *int_ptr; int mem_size = 50; 
char_ptr = (char *) malloc(mem_size); 
strcpy(char_ptr, "This is memory is located on the heap."); 
printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr); 
int_ptr = (int *) malloc(12); 
*int_ptr = 31337; 
printf("int_ptr (%p) --> %d\n", int_ptr, *int_ptr);
  • 对于char_ptr:strcpy把字符串放到了char_ptr指向的堆内存里,printf("%s", char_ptr)直接用这个首地址,printf自动遍历到'\0',所以输出完整字符串。
  • 对于int_ptr:*int_ptr = 31337是把数值存到指针指向的内存里,printf("%d", *int_ptr)解引用后拿到这个数值,所以输出31337。

额外提个反例

要是你非要给%s传*char_ptr会怎么样?那就是把第一个字符的ASCII值(比如这里是'T',对应ASCII码84)当成内存地址,这显然是无效地址,程序大概率会崩溃或者输出乱码——所以绝对不能这么干。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:12:45