为什么一个字符在数组中似乎比它本身占用更多的空间
Why does a char seem to take more space in an array than by itself
char testChar = 'a';
char myCharString[] = "asd";
char *pointerToFirstChar = &(myCharString[0]);
char *pointerToSecondChar = &(myCharString[1]);
cout << "A char takes " << sizeof(testChar) << " byte(s)";
cout << "Value was " << pointerToFirstChar << ", address: " << &pointerToFirstChar << endl;
cout << "Value 2 was " << pointerToSecondChar << ", address:" << &pointerToSecondChar << endl;
该输出:
"一个字符占用1个字节">
"…地址:00F3F718">
"…地址:00F3F70C",
我认为地址之间的差异应该是1个字节,因为这将是分隔它们的数据的大小。为什么不是这样?
&pointerToFirstChar
和&pointerToSecondChar
,您不获取char
数组元素的地址,而是获取局部变量pointerToFirstChar
和pointerToSecondChar
的地址。注意,它们本身就是指针。
你可能想要:
cout << "Value was " << pointerToFirstChar << ", address: " << static_cast<void*>(pointerToFirstChar) << endl;
cout << "Value 2 was " << pointerToSecondChar << ", address:" << static_cast<void*>(pointerToSecondChar) << endl;
请注意,您需要将它们强制转换为void*
以打印出地址而不是字符串。
您正在查看指针pointerToFirstChar
和pointerToSecondChar
的地址。它们是指向char的指针;比较它们的值,它们将相差1。你似乎把它删掉了。
您打印的是指针变量的地址,而不是当前指针所在的地址。
例如:
&myCharString[0] = 0xFE20 &myCharString[1] = 0xFE21 &myCharString[2] = 0xFE23
char *pointerToFirstChar = &(myCharString[0]);
pointerToFirstChar的地址=0xF8C2,并且它保存地址&myCharString[0]=0xFE20
所以您正在打印,0xF8C2而不是打印0xFE20
按照如下方式更新代码以获得正确的结果。
cout << "Value was " << pointerToFirstChar << ", address: " << (void *)&pointerToFirstChar[0] << endl;
cout << "Value 2 was " << pointerToSecondChar << ", address:" << (void *)&pointerToSecondChar[0] << endl;
欲了解更多信息,请点击以下链接字符数组的打印地址
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 是否可以将函数导入命名空间,但不能导出它?
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 如何使用基于范围的for循环迭代Rapidjson文档(它本身就是一个JSON数组)
- 如何在命名空间中声明外部全局,然后定义它?
- 我可以删除对象本身并重新分配它
- 这两个代码之间的差异(为什么我的数组也有额外的空间,即使我限制了它)
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 隐式“使用命名空间std”而无需在源代码中编写它
- 是否允许在 std::d eclval 上使用 decltype<T>(函数本身,而不是调用它的结果)?
- 派生类需要多少空间?如果它本身和它的基类都有虚拟方法
- 一个数减去它本身就得到无穷大
- 定义一个全局变量并在那里初始化它本身可以吗?
- 什么是“使用命名空间 std;”,为什么我需要它来编译具有最新C++编译器的程序
- 引用数据类型的 & 符号是否返回引用本身的地址或它所引用的值
- 异常对象在哪里有其空间、堆或堆栈,以及如何在不同的类中访问它
- 找不到命名空间,尽管它就在那里
- 如果您使用new来分配空间,您必须在何时释放它
- 为什么一个字符在数组中似乎比它本身占用更多的空间