C++地址值和sizeof
C++ address value and sizeof
在我的电脑上。当我测试代码时:
int main()
{
int i=123;
return 0;
}
使用
g++ -g test.cpp -o test
我输入的时候发现:
print &i output: 0x7fffffffe18c
print sizeof(&i) output: 8
我一头雾水,i的地址是6字节,为什么sizeof(&i)==8
?
非常感谢
执行此操作时,您将获得 i
的地址
print &i output: 0x7fffffffe18c
输出显示变量 i 存储的地址编号,但 printf 将删除前导零,因此您只能看到 0x7fffffffe18c 而不是 0x00007fffffffe18c ,你可以使用调试器来验证它
当你调用 sizeof(&i)
print sizeof(&i) output: 8
你得到 8 个字节,因为你得到的是地址的大小而不是变量 i 的大小,如果你想得到变量的大小就这样做
sizeof(i)
地址实际上是0x00007fffffffe18c
,打印不显示前导零。
sizeof
适用于类型,而不是值,因为值最终必须存储在某种类型的容器中,并且编译器通常无法预测变量在编译时必须持有什么值时间:
void f(int* ptr); // does it need to hold 0? 1000? 1<<27?
写的时候
sizeof(i);
size_t f(int* ptr) { return sizeof(ptr); }
实际上被视为等同于
sizeof decltype(i);
size_t f(int* ptr) { return sizeof(decltype(ptr)); }
其中 decltype(i)
计算为任何类型 i
被声明为:
int i; :- decltype(i) evaluates to "int"
int* i; :- decltype(i) evaluates to "int*"
int*& i; :- decltype(i) evaluates to "int*&"
并在 f
sizeof(ptr) :- decltype(ptr) evaluates to "int*"
您编译了一个 64 位可执行文件,因此指针必须能够保存值 [0,1^64),这需要 64 位或 8 个字节。
#include <cstdio>
int main()
{
int i = 10;
printf("i = %d, &i = %0p, sizeof(&i) = %d\n", i, &i, sizeof(&i));
}
在 32 位机器上:http://ideone.com/htfy9R
在我的电脑上。当我测试代码时:
int main()
{
int i=123;
return 0;
}
使用
g++ -g test.cpp -o test
我输入的时候发现:
print &i output: 0x7fffffffe18c
print sizeof(&i) output: 8
我一头雾水,i的地址是6字节,为什么sizeof(&i)==8
?
非常感谢
执行此操作时,您将获得 i
的地址print &i output: 0x7fffffffe18c
输出显示变量 i 存储的地址编号,但 printf 将删除前导零,因此您只能看到 0x7fffffffe18c 而不是 0x00007fffffffe18c ,你可以使用调试器来验证它
当你调用 sizeof(&i)
print sizeof(&i) output: 8
你得到 8 个字节,因为你得到的是地址的大小而不是变量 i 的大小,如果你想得到变量的大小就这样做
sizeof(i)
地址实际上是0x00007fffffffe18c
,打印不显示前导零。
sizeof
适用于类型,而不是值,因为值最终必须存储在某种类型的容器中,并且编译器通常无法预测变量在编译时必须持有什么值时间:
void f(int* ptr); // does it need to hold 0? 1000? 1<<27?
写的时候
sizeof(i);
size_t f(int* ptr) { return sizeof(ptr); }
实际上被视为等同于
sizeof decltype(i);
size_t f(int* ptr) { return sizeof(decltype(ptr)); }
其中 decltype(i)
计算为任何类型 i
被声明为:
int i; :- decltype(i) evaluates to "int"
int* i; :- decltype(i) evaluates to "int*"
int*& i; :- decltype(i) evaluates to "int*&"
并在 f
sizeof(ptr) :- decltype(ptr) evaluates to "int*"
您编译了一个 64 位可执行文件,因此指针必须能够保存值 [0,1^64),这需要 64 位或 8 个字节。
#include <cstdio>
int main()
{
int i = 10;
printf("i = %d, &i = %0p, sizeof(&i) = %d\n", i, &i, sizeof(&i));
}
在 32 位机器上:http://ideone.com/htfy9R