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

C语言字符指针指向问题:为何存储字符异常且始终指向41?

指针输出异常问题排查

先把你的代码贴出来方便分析:

char ch = 'A'; 
char *cPtr1, *cPtr2; 
cPtr1 = &ch; 
cPtr2 = cPtr1; 
printf("cPtr1 Stored:%c Point:%x Memory:%x\n", cPtr1, *cPtr1, &cPtr1); 
printf("cPtr2 Stored:%c Point:%x Memory:%x\n", cPtr2, *cPtr2, &cPtr2);

问题根源:格式符与变量类型不匹配

你这里犯了一个典型的新手错误——printf的格式说明符和传入的变量类型完全对应错了:

  • 第一个占位符%c你用来打印cPtr1,但cPtr1是指针变量,它存储的是ch的内存地址,不是字符。把指针地址当成字符解析,自然会输出随机的奇怪字符。
  • 第二个占位符%x你用来打印*cPtr1,*cPtr1是指针指向的字符'A',它的ASCII值是65,转换成十六进制就是0x41,所以你每次都看到41,这其实是字符'A'的十六进制值,只是你放错了输出位置。
  • 第三个占位符%x用来打印&cPtr1(指针自身的地址),虽然%x可以打印十六进制地址,但标准写法应该用%p,它是专门用来打印指针地址的格式符。

修正后的代码

把格式符和变量类型对应起来就没问题了:

char ch = 'A'; 
char *cPtr1, *cPtr2; 
cPtr1 = &ch; 
cPtr2 = cPtr1; 
// 修正格式符:%p打印指针地址,%c打印字符
printf("cPtr1 Stored:%p Point:%c Memory:%p\n", cPtr1, *cPtr1, &cPtr1); 
printf("cPtr2 Stored:%p Point:%c Memory:%p\n", cPtr2, *cPtr2, &cPtr2);

修正后输出说明

  • Stored:%p会打印指针存储的地址(也就是ch的地址),你会看到cPtr1和cPtr2的这个值完全一样,因为cPtr2 = cPtr1让它们指向了同一个内存位置。
  • Point:%c会打印指针指向的字符,也就是'A',两个指针的这个输出都是'A'。
  • Memory:%p会打印指针自身的内存地址,cPtr1和cPtr2是两个不同的变量,所以这个地址是不一样的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:07:31