我第一次在 C 中使用指针。我尝试为 3 个指针声明、初始化和分配内存地址,然后打印每个指针和变量的地址和值,然后为指针赋值,所以具有内存地址的数据的值已更改。这是代码:
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;
是当我更改
i
、f
和 c
的值时。
但是,当我运行程序时,
int
变量的内存地址不是十六进制格式,它们是随机数,每次运行程序时都会改变。 char
的地址没有出现。此外,当我修改指针中的值时,它们指向的变量不会改变。我以为这就是您按价值引用的方式,我真的很困惑。
这次(第二次)调用 printf
printf("\nThe addresses of each pointer are: ");
printf("%d %f %c", iPtr, fPtr, cPtr);
错了。您正在尝试将指针输出为没有意义的 int、float 和 char 类型的对象。
如果你想在你需要写的指针中输出存储的地址
printf("\nThe addresses of each pointer are: ");
printf("%p %p %p\n", ( void * )iPtr, ( void * )fPtr, ( void * )cPtr);
(不要忘记在格式字符串中放置换行符
'\n'
)
也在这个 printf 的调用中
printf("\nThe modified values are: ");
printf("%d %f %c", i, f, c);
您没有输出修改后的值。变量 i、f 和 c 的值没有改变。看来你的意思是
*iPtr = iNumber;
*fPtr = fNumber;
*cPtr cCharacter;
printf("\nThe modified values are: ");
printf("%d %f %c\n", i, f, c);
我认为最终您想将
i
的值从5
更改为变量iNumber
的值,即使用指针的2
。
iNumber = *iPtr;
fNumber = *fPtr;
cCharacter = *cPtr;
你在这里所做的是,将每个指针变量的值分配给
iNumber
,fNumber
,cCharacter
变量。
所以现在,如果您打印这些变量,您可以看到
iNumber
、fNumber
、cCharacter
的值相应地更改为 5
、7.77
、a
。因为,那些指针变量指向前 3 个变量的地址,即 &i
、&f
和 &c
,正如您可能已经猜到的那样。
*iPtr = iNumber;
*fPtr = fNumber;
*cPtr = cCharacter;
正如您在上面的代码片段中看到的,您需要将新值/变量分配给指针变量,而不是相反。
printf("\nThe addresses of each pointer are: ");
printf("%d %f %c", iPtr, fPtr, cPtr);
要在 C 中打印变量的内存地址,您需要在
%p
中使用 printf()
格式说明符,而不是 %d
或 %f
。 %p
格式说明符专门用于以十六进制格式打印内存地址。
此外,当您打印变量的内存地址时,您必须使用
address-of
运算符 (&),它用于获取变量的地址。
printf("\nThe addresses of each pointer are: ");
printf("%p %p %p", &iPtr, &fPtr, &cPtr); // hexadecimal
// not the standard way to represent memory addresses
printf("%u %u %u", &iPtr, &fPtr, &cPtr); // decimal
提示:您可以用十进制而不是十六进制打印地址 为了省心,只需将
替换为%p
。 (%u
运算符在打印内存地址时保持不变)adreess-of
当你运行你的C程序时,计算机会为你程序中的每个变量分配一个内存地址。内存地址通常表示为一个大数字,通常采用十六进制格式。内存地址很重要,因为它允许程序访问和操作存储在内存中该位置的变量值。
但是,出于多种原因,变量的内存地址可以从一个程序运行到另一个程序运行,例如内存空间的随机化,堆或堆栈上的内存分配,或编译器对程序代码的优化或链接器。
但作为初学者,您不必担心。