我对指针不太熟悉,因为我主要做java,而java没有指针,现在我正在学习C ++。在C ++教程中,为了知道变量占用的内存大小,导师使用指向变量的指针的大小,即
int v = 23;
int *p = &v;
cout << sizeof(p) << endl;
这让我感到困惑,因为在我的第一年,我接受了C编程的教学,我将需要在变量本身上做sizeof。所以我首先得出结论,他们的意思相同。但是,当我在我的电脑上尝试时,我有不同的结果。我有以下代码......
#include <iostream>
int main()
{
int *ptr = new int;
int n = 23;
ptr = &n;
std::cout << sizeof(n) << std::endl;
std::cout << sizeof(ptr) << std::endl;
return 0;
}
当我运行上面的代码时,我得到4和8的输出。但是我的朋友在他的机器上编译并执行了相同的代码,他的输出为4和4.我不知道为什么这是发生以及为什么导师在指向变量的指针上使用sizeof而不是在变量本身上使用sizeof,因为他想知道该变量占用的内存量。我知道C / C ++中的变量由于不同的体系结构而具有不同的内存容量,至少这是我在C中所教授的.64位机器中的int与32位机器上的int有不同的大小。但我虽然我的结果必须至少是一致的,即8和8,或4和4.我使用的是64位架构和64位操作系统,我的朋友正在使用64位架构和32位操作系统。
答案 0 :(得分:10)
在您的代码中,
cout << sizeof(p) << endl;
为您提供变量p
的大小,其类型为int *
。
与
相同cout << sizeof(*p) << endl;
或
cout << sizeof(int) << endl;
将为您提供int
变量占用的大小。
话虽如此,为了澄清,要了解变量占用的大小,您需要在该变量上使用sizeof
运算符,而不是指向该变量的指针。 (你在第一年学到的东西 正确)。
请注意,指针的大小取决于体系结构,因此它可能会有所不同。在某些体系结构中,指针的大小可以是32位(sizeof
将返回4),在某些其他体系结构中,它可以是64位(sizeof
将返回8)。
答案 1 :(得分:3)
您必须对值本身使用sizeof
才能知道变量占用了多少内存。我认为导师做错了。
int v = 23;
int a[5] = {0, 1, 2, 3, 4};
int *p = &v;
cout << sizeof(p) << endl; // print the size of int*
cout << sizeof(*p) << endl; // print the size of int
cout << sizeof(v) << endl; // print the size of int
p = a;
cout << sizeof(p) << endl; // print the size of int*
cout << sizeof(*p) << endl; // print the size of int
cout << sizeof(a) << endl; // print the size of int[5]
答案 2 :(得分:1)
sizeof(ptr)
给出指针ptr
的大小,其大小是实现定义的。 sizeof(int)
也是如此。这就是你和你的朋友获得不同结果的原因
您可以将输出作为4 4
和8 8
的其他可能性。
答案 3 :(得分:0)
sizeof
将为您提供表示特定类型对象所需的字节数。在您的行中
std::cout << sizeof(n) << std::endl;
n
为int
,因此这将为您提供int valiable的大小
行std::cout << sizeof(ptr) << std::endl;
ptr
是指向整数的类型指针,因此这将为您提供int*
的大小。它们的值不保证是相同的,并且在不同的体系结构上都会独立变化。 c ++标准没有说明这些类型的大小应该是什么。
根据N 3690标准草案:
&#34; sizeof
运算符产生其操作数的对象表示中的字节数。操作数是
表达式,它是未评估的操作数(第5条)或带括号的type-id。 sizeof
operator不应用于枚举类型的具有函数或类型不完整的表达式
在声明所有枚举数之前,其基础类型不是固定的,而是运行时数组
绑定到这些类型的带括号的名称,或指定位字段的glvalue。 sizeof(char)
,
sizeof(signed char)
和sizeof(unsigned char)
是1. sizeof应用于任何其他的结果
基本类型(3.9.1)是实现定义的。&#34;
答案 4 :(得分:0)
对于编译器,无论数据类型如何,所有指针都具有固定大小。 32位计算机中指针的大小为4字节,而64位指针大小为8字节。这就是你的朋友获得4作为指针大小而你得到8的原因。