C++ 当我试图检查指针变量的大小时,例如int*p sizeof(p),那么总是给出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)始终

当我声明一个大小为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];
cout
sizeof(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后,一些广告:。第三部分是关于外部数组的大小以及作为参数传递给函数时的大小。;-)