C++ 当我试图检查指针变量的大小时,例如int*p sizeof(p),那么总是给出8位。为什么?
当我声明一个大小为10的整数数组并检查其大小时,它给出了40,但当我声明一个大小为10的整数指针变量并尝试检查其大小时,它总是给出8。为什么?C++ 当我试图检查指针变量的大小时,例如int*p sizeof(p),那么总是给出8位。为什么?,c++,C++,当我声明一个大小为10的整数数组并检查其大小时,它给出了40,但当我声明一个大小为10的整数指针变量并尝试检查其大小时,它总是给出8。为什么? int A[10]; cout<<sizeof(A)<<endl; // it gives 40; int *p; p = new int[10]; cout<<sizeof(*p)<<endl; // but it gives always 8; inta[10]; coutsizeof(p)始终
int A[10];
cout<<sizeof(A)<<endl; // it gives 40;
int *p;
p = new int[10];
cout<<sizeof(*p)<<endl; // but it gives always 8;
inta[10];
coutsizeof(p)
始终是sizeof(int*)
,在您的平台上是8
无论您使用new[]
分配多少对象,这一点都不会改变
A
的类型为int[10]
(由10个int
s组成的数组)。它的大小是10*sizeof(int)
。
sizeof(A)
为40是有道理的
指针和数组是不同的类型。它们可以在许多用例中互换使用,但了解它们的不同之处以及它们在何处表现不同也很重要sizeof
运算符是不同的用例之一。在典型的64位机器上,sizeof(*p)
应该是4
,而sizeof(p)
应该是8
希望这个例子能澄清问题:
int p1[10];
cout<<sizeof(*p1)<<endl; // 4 size of the first element (int)
cout<<sizeof(p1)<<endl; // 40 size of array (int size * 10)
int *p2;
p2 = new int[10];
cout<<sizeof(*p2)<<endl; // 4 size of the first element (int)
cout<<sizeof(p2)<<endl; // 8 size of the pointer on 64-bit system
// shows how you're getting the first value by dereferencing
cout<<*p2<<endl; // 0
p2[0] = 100;
cout<<*p2<<endl; // 100
intp1[10];
cout始终指针保存数组的起始地址。因为它是一个int指针,在我们的系统中int的大小是8个字节,所以它显示8个字节。您自己说过,您使用的是指针的大小,即8。而且sizeof(p)
和sizeof(*p)
之间有很大的区别。请澄清你说的是哪一个。注意:我可能在这里看到一个打字错误,但以防万一。。。这8是字节,不是位。大概你真正想做的是使用std::vector
并调用它的.size()
方法(它是以元素的数量表示的,而不是以位或字节表示的)。你的问题是错的coutand在我们的系统中int的大小是8字节,这是胡说八道。我不知道任何64位int
的系统。(在过去,我有一个16位int
的平台,一些嵌入式系统可能仍然有。)但最重要的是:int
的大小和指针的大小无关。(只要我们编译了32位代码,它就不那么明显了,但当我们切换到64位时,它给我的打击很大。)这就是为什么引入了类似的类型。Scheff,这太荒谬了。请自己尝试下面的程序,并在每次增加(PTR++)时记下指针地址(%d或%p)。因为它是int指针,所以每次增加4个字节。对于仅增加1个字节的字符数组也是如此。请尝试此操作,。Int arr[5]={10,20,30,40,50};。int*PTR,I;PTR=&are;对于(I=0;I在离开我的upvote后,一些广告:。第三部分是关于外部数组的大小以及作为参数传递给函数时的大小。;-)