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
相关产品推荐
相关产品推荐

