c - 无论我尝试什么,我的指针/地址都是错误的
问题描述
这是我正在尝试的:
int a,b;
int *ptr;
a = 123;
ptr = &a;
b = *ptr;
printf("&a is %p\n",&a);
printf("ptr points to %p\n",ptr);
printf("&ptr is %p\n",&ptr);
printf("&b is %p\n",&b);
结果是:
&a is 0x7ffee01fc828
ptr points to 0x7ffee01fc828
&ptr is 0x7ffee01fc818
&b is 0x7ffee01fc820
我希望 &b 显示与 &a 相同的地址...但事实并非如此,所以我尝试了:
int a,*b;
int *ptr;
a = 123;
ptr = &a;
b = ptr;
printf("&a is %p\n",&a);
printf("ptr points to %p\n",ptr);
printf("&ptr is %p\n",&ptr);
printf("&b is %p\n",&b);
这仍然会导致 &b 出现意外的内存地址:
&a is 0x7ffee1cbd828
ptr points to 0x7ffee1cbd828
&ptr is 0x7ffee1cbd818
&b is 0x7ffee1cbd820
有人可以帮我理解为什么我无法让 &b 与 &ptr 或 &a 匹配相同的地址吗?
谢谢!
解决方案
我希望 &b 显示与 &a 相同的地址...</p>
有这种期望意味着您对指针如何工作以及它们在 C 编程语言中的语义有一个错误的心理模型。关键的误解似乎发生在原始代码片段的这两行:
首先你有
b = *ptr;
这一行翻译成*“将地址处的内存内容复制ptr
到变量b
中。” 该变量b
甚至从未与指针本身接触。你可以把它改写成同样的效果
int tmp = *ptr;
b = tmp;
事实上,每个现代 C 编译器都会为这两种情况生成相同的代码。
您有误解的第二行是这一行
printf("&b is %p\n",&b);
特别是取变量地址的影响b
,即&b
. b
是一个完全独立的变量,有自己的地址。这个地址不能改!变量唯一可以改变的是它的值。
指针也是变量,是的,指针本身也有地址。指针的值是它指向的地址。但是像每个变量一样,您无法更改存储变量的地址,并且当您将地址分配给指针时,您正在更改其值。因此,当您的第二个代码被剪断时,您分配b = ptr;
的是复制to的值。之后,和都指向同一个地址,但这两个指针是同一个值的两个独立副本,其中每个副本被放置在内存中的不同位置。自然地,取 的地址会产生与 的地址不同的东西。ptr
b
ptr
b
b
ptr
推荐阅读
- php - Laravel 寻找单数表名
- javascript - 如何在量角器节点js中将字符串值与YYYY-MM-DD格式的日期进行比较
- mapreduce - Map Worker 失败时 Mapreduce 中的容错
- javascript - 在 TypeScript 中使用 Reduce 实现 Map 函数
- android - 证书安装程序的有效性,从 Play Market 中删除应用程序后
- python - 熊猫创建一个具有多个其他列的复杂条件的新列
- java - 仅在 Websphere 的 guava-30.0-jre.jar 的 com.google.common.util.concurrent 包中获取类 SettableFuture 的 NoClassDefFoundError
- react-native - 蓝牙扫描仪设备在 React Native 中接收数据
- flutter - Flutter / Dart - 从浮动操作按钮调用的 SetState 问题
- sql-server - 在 Visual Studio 数据库项目中使用图形查询时的警告