使用sizeof运算符

时间:2011-03-26 07:47:54

标签: c sizeof

以下程序的输出

#include<stdio.h>
int main(){
    int *p[10];
    printf("%ld %ld\n",sizeof(*p),sizeof(p));
}

8   <--- sizeof(*p) gives  size of single element in the array of int *p[10] 
80  <--- sizeof(p) gives  size of whole array which is 10 * 8 in size.

现在看到以下程序

 #include<stdio.h>
 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
 int array[] = {23,34,12,17,204,99,16};

  int main()
  {
      int d;
      printf("sizeof(array) = %ld \n",sizeof(array));
      printf("sizeof(array[0]) = %ld \n",sizeof(array[0]));
      printf("sizeof int %ld\n",sizeof(int));
      printf("TOTAL_ELEMENTS=%ld \n",TOTAL_ELEMENTS);
      for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
          printf("%d\n",array[d+1]);

      return 0;
  }

sizeof(array) = 28 
sizeof(array[0]) = 4  <--here
sizeof int 4
TOTAL_ELEMENTS=7 

我无法理解的是为什么sizeof(array [0])在两个输出中都不同。

6 个答案:

答案 0 :(得分:11)

int *p[10]; 是一个指针数组。

*p 是指针数组的第一个元素。所以它是一个指向整数的指针。它不是整数。

int array[] = {23,34,12,17,204,99,16};是一个整数数组。所以array[0]是该数组的第一个元素。所以它是一个整数。

指向整数(*p)和整数(array[0])的指针大小不同。

所以sizeof(*p)sizeof(array[0]) 是不同的。

sizeof(p)给出指针数组的大小。所以它是:10 x 8 = 80 即(元素数量)x(一个元素的大小

sizeof(array)给出整数数组的大小。所以它是:7 x 4 = 28。

答案 1 :(得分:3)

在第一个例子中,元素是指向int的指针,而在第二个例子中,它只是int。你可以看到指针有8个字节,int只有4个字节。

答案 2 :(得分:1)

在第一种情况下,你创建了一个指向int的指针数组,因此它们的大小是8而不是4。

答案 3 :(得分:1)

在第一个示例中,使用指针的大小,在第二个示例中使用整数的大小。它们可能具有不同的大小,尤其是在64位系统上。

答案 4 :(得分:1)

array[0]的类型为int

*p的类型为int*

这或许可以证明写作的风格愚蠢

int *p[10] ;

而不是

int* p[10] ;

其中第二个更清楚的是int *是被声明的数组的类型。

答案 5 :(得分:0)

64位环境将int设置为32位,long指向64位..

* p是指针 - 8个字节
 sizeof(p) - 大小为10个指针 - 所以80个字节

有可能你有AMD64机器 - 查看详细信息(包括其他选项) http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html