如何使用指针更改变量的内容?

问题描述 投票:0回答:2

我第一次在 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
的地址没有出现。此外,当我修改指针中的值时,它们指向的变量不会改变。我以为这就是您按价值引用的方式,我真的很困惑。

c pointers printf variable-assignment conversion-specifier
2个回答
0
投票

这次(第二次)调用 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);

0
投票

使用指针更改值


我认为最终您想将

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程序时,计算机会为你程序中的每个变量分配一个内存地址。内存地址通常表示为一个大数字,通常采用十六进制格式。内存地址很重要,因为它允许程序访问和操作存储在内存中该位置的变量值。

但是,出于多种原因,变量的内存地址可以从一个程序运行到另一个程序运行,例如内存空间的随机化,堆或堆栈上的内存分配,或编译器对程序代码的优化或链接器。

但作为初学者,您不必担心。

© www.soinside.com 2019 - 2024. All rights reserved.