c++ - C++ 内存地址
问题描述
如果这是一个重复的问题,请原谅
这是我的代码
#include "stdafx.h"
#include <stdio.h>
#include "iostream"
#include <stdlib.h>
using namespace std;
int main()
{
char * name = "Hello";
cout << "2" << endl;
cout << "Address2 is " << &name << " value at address is " << * (&name) << endl;
cout << "Next address2 is " << &name + 1 << " value at address is " << name + 1 << " " << sizeof(char) << endl;
cout << "3" << endl;
cout << "Address3 is " << &name << " value at address is " << name << endl;
cout << "Next address3 is " << &name + sizeof name << " value at address is " << name + sizeof name << endl;
getchar();
}
这是输出
Address2 是 003EFAA4 地址的值是 Hello // 容易理解
下一个地址 2 是003EFAA8 (这是我难以理解的地方。我的理解是下一个地址应该是 003EFAA5 考虑到 char 是 1 字节?
输出与 1 相同
下一个地址 2 是003EFAB4 (这也是我难以理解的地方。我的理解是当变量名的地址是 003EFAA4 时,下一个地址应该是 003EFAA8 考虑到 char 指针的大小是 4 字节?
我对内存的理解是地址是以字节为单位引用的。如果这是真的,那么为什么在上面的数字 3 中它给我的地址是 4 个字节,而在上面的数字 4 中它给我的下一个地址是 10 个字节?
任何解释将不胜感激。谢谢
解决方案
下一个地址 2 是 003EFAA8 (这是我难以理解的地方。我的理解是下一个地址应该是 003EFAA5 考虑到 char 是 1 字节?
当您执行此操作时,&name + 1
您将转到类型的下一个地址name
。 name
不是char
虽然。它是 achar*
并且在您的系统char*
上 a 的大小为 4。这就是它向前移动 4 个字节的原因,因为这是下一个char*
可以定位的位置。
下一个地址 2 是 003EFAB4 (这也是我难以理解的地方。我的理解是当变量名的地址是 003EFAA4 时,下一个地址应该是 003EFAA8 考虑到 char 指针的大小是 4 字节?
这基本上与上面发生的事情相同,但不是去下一个char*
,而是去sizeof name
下一个元素,在这种情况下是第四个元素。
推荐阅读
- java - 如何在 Spring MVC 中使用 @ModelAttribute 获取默认值?
- dialogflow-es - 如何在 Dialogflow 中禁用意图
- reactjs - 调用外部函数时,旧的“useEffect 缺少依赖项”
- sockets - Python socket ssl 认证问题
- javascript - 调用函数与在回调中调用函数
- spock - java.lang.AbstractMethodError 在为我的 SPOCK 测试实现 Spock-Reports 扩展 (renatoathaydes)
- java - 限制 Infinispan Cache 在集群中添加多个节点
- python - 在熊猫中从另一个数据帧中减去一个数据帧,元素明智
- ios - 如何从 SwiftUI 中的侧边菜单导航到新视图
- ruby-on-rails - 如何将属性映射到 Rails 中的对象列表?