C语言中如何通过指针修改变量值?指针使用问题求助
C语言指针使用问题排查
问题描述
首次尝试在C语言中使用指针,目标是声明、初始化指针并通过指针修改变量i、f、c的值,但运行代码后遇到三个问题:
- int类型变量的地址不是十六进制格式,且每次运行地址变化
- char类型指针的地址无法显示
- 修改指针相关操作后,指向的变量值并未改变
原代码
int i = 5; float f = 7.77; char c = 'a'; int iNumber = 2; float fNumber = 5.55; char cCharacter = 'c'; int *iPtr; float *fPtr; char *cPtr; iPtr = &i; fPtr = &f; cPtr = &c; printf("\nThe current values are: "); printf("%d %f %c", i, f, c); printf("\nThe addresses of each pointer are: "); printf("%d %f %c", iPtr, fPtr, cPtr); iNumber = *iPtr; fNumber = *fPtr; cCharacter = *cPtr; printf("\nThe modified values are: "); printf("%d %f %c", i, f, c); printf("\nThe addresses of each pointer are: "); printf("%d %f %c", iPtr, fPtr, cPtr); return 0;
问题原因与修复方案
1. 指针地址打印格式错误,char指针无法显示
C语言中打印指针地址必须用%p格式符,你用的%d、%f、%c都是不匹配的格式符,属于未定义行为,直接导致输出异常:
%d打印十进制整数,指针地址本质是十六进制内存地址,用它会显示十进制数值;而地址每次运行变化是正常现象——现代操作系统的ASLR(地址空间布局随机化)机制会随机分配内存地址,用于防范恶意攻击。%c用于打印字符,char指针是内存地址,用它会把地址对应的ASCII码转成字符,自然无法显示正确地址。
修复方式:把打印指针的格式符全部换成%p,且按标准要求将指针强制转为void*类型:
printf("\nThe addresses of each pointer are: "); printf("%p %p %p", (void*)iPtr, (void*)fPtr, (void*)cPtr);
2. 未通过指针修改目标变量的值
你的代码中iNumber = *iPtr;这类操作,是把指针指向的变量值赋值给另一个变量,完全没有修改原变量i、f、c的值。要修改原变量,必须用*指针 = 新值的写法:
比如要把i改成10,f改成9.99,c改成'b',代码应写为:
*iPtr = 10; // 修改i的值 *fPtr = 9.99; // 修改f的值 *cPtr = 'b'; // 修改c的值
修复后的完整代码
#include <stdio.h> int main() { int i = 5; float f = 7.77; char c = 'a'; int *iPtr = &i; float *fPtr = &f; char *cPtr = &c; printf("\nThe current values are: "); printf("%d %.2f %c", i, f, c); printf("\nThe addresses of each pointer are: "); printf("%p %p %p", (void*)iPtr, (void*)fPtr, (void*)cPtr); // 通过指针修改原变量的值 *iPtr = 10; *fPtr = 9.99; *cPtr = 'b'; printf("\nThe modified values are: "); printf("%d %.2f %c", i, f, c); printf("\nThe addresses of each pointer are: "); printf("%p %p %p", (void*)iPtr, (void*)fPtr, (void*)cPtr); return 0; }
内容的提问来源于stack exchange,提问作者c_and_me1
相关产品推荐
相关产品推荐

