深入谈谈C/C++的sizeof( )的计算(指针和数组)

来源:岁月联盟 编辑:exp 时间:2011-11-22

  先说说数组和指针吧:看看下面的东西做个准备哈,,,

 

int q[3][4]={{1,3,5,7},{3,4,6,7},{1,6,8,9}};

 

a                              二维数组名,指向一维数组a[0],即零行的地址

 

a[0],*(a+0),*a                 0行0列的地址

 

a+1,&a[1]                      1行的首地址

 

a[1],*(a+1)                    1行0列元素a[1][0]的地址(同a[1]+0,*(a+1)+0)

 

a[1]+2,*(a+1)+2,&a[1][2]       1行零列元素a[1][2]的地址(同上)

 

*(a[1]+2),*(*(a+1)+2),a[1][2]  1行2列夫元素a[1][2]的值

    如果不懂就多看几遍吧,由于我文章重点不是在这个,今天主演是想象谈谈sizeof( ),所以你懂的!呵呵

 

     首先要指出很多初学者易犯的错误,那就是很多人在学完C或C++的时候总会认为sizeof()是一个函数。其实sizeof( )根本就不是什么函数。而是一个长度运算符。其实自己在一开始也总是这么认为的,呵呵,,没什么一起来探讨这个问题吧!

 

 

 

首先在说说为什么sizeof( )为什么不是函数吧!其实也没有什么为什么吧,他本来就不是啊,还是举个例子说明一下吧!

 

 

 

#include<stdio.h>

 

void main()

 

{

 

       int a,b;

 

       b=sizeofa;

 

       printf("%d/n",b);

 

       getchar();

 

};

 

 

看看运行结果:

 

 /

 

 

   想象如果是函数,sizeof( )的括号可以省略吗?显然是函数这是不可能的!

 

 

 

   现在我们进入我的正题吧,看看sizeof( )的计算长度时,这里面有好几个地方都特别容易出错,现在为大家总结一下,呵呵,,不多说最好的例子就是代码了,看看下面的代码吧:

 

运行结果:

 

 

 

#include<stdio.h>

 

void main()

 

{

 

       int int_data=0;                   

 

       float float_data=(float)1.2;        

 

       double double_data=(double)4.3;   

 

       int *int_ptr_1=&int_data;

 

       char ch='a';

 

       char *char_ptr_2=&ch;       

 

       char char_1[5]={'a','b','c','d','e'};  

 

       char char_2[4][5]={          

 

              {'a','b','c','d','e'},

 

              {'a','b','c','d','e'},

 

              {'a','b','c','d','e'},

 

              {'a','b','c','d','e'},

 

       };         

 

       printf("sizeof(int_data)    %d/n",sizeof(int_data));

 

       printf("sizof(float_data)   %d/n",sizeof(float_data));

 

       printf("sizeof(double_data)%d/n",sizeof(double_data));

 

       printf("sizeof(int_ptr_1)   %d/n",sizeof(int_ptr_1));

 

       printf("sizeof(char_ptr_2)  %d/n",sizeof(char_ptr_2));   //指针变量将分配一个机器字节用于存放地址的值

 

       printf("sizeof(char_1)      %d/n",sizeof(char_1));

 

       printf("sizeof(char_2)      %d/n",sizeof(char_2));

 

       printf("sizeof(char_2[1])   %d/n",sizeof(char_2[1]));

 

       printf("sizeof(*(char_2+1))%d/n",sizeof(*(char_2+1)));

 

       printf("sizeof(char_2+1)    %d/n",sizeof(char_2+1));

 

       printf("sizeof(&char_2[1])  %d/n",sizeof(&char_2[1]));

 

       printf("sizeof(char_2[1][2])%d/n",sizeof(char_2[1][2]));

 

     

 

     

 

}

 

 

运行结果如下:

 /

 

稍微解释一下上面的情况!

 

   1,sizeof(char_ptr_2));   //指针变量将分配一个机器字长(一般4个字节,不同位数机器不同)用于存放地址的值,尽管char_ptr_2只指向的是一个char 类型的.

 

 

 

   2, sizeof(char_1), sizeof(char_2)中char_1和char_2都是数组名;代表了整个数组,尽管地址是char_2代表的是零行的地址,但是他代表的是二维数组char_2[4][5];所以,,,,,

 

,char_1尽管指向的则是一位数组char_1[5]的首地址,但他是一位数组名,代表的是一位数组这个整体。注意和那个sizeof(chr_1_ptr)和sizeof(char_2_ptr)的区别,指针变量char_1_ptr和char_2_ptr他们的值就是一个地址,也就是一个机器字长!

 

 

 

   3,对于char_2[1]是1行0列元素char_2 [1][0]的地址,其实也就是二位数组的第二行的首地址,其实二维数组的第二行就是一个一维数组,而cahr_2[1]则和char_1的含义是一样的(扮演的角色一样)。都是一维数组的首地址,所以sizeof(char_1)和sizeof(char_2[1])的值是一样的。

 

 

 

   4,与3不同的是对于sizeof(char_2+1)的情况就不样了,你可以看看cahr_2+1值得是第二行的地址,此时他的值也就是一个地址,也就是一个机器字长!

 

特别注意3,4的微妙的区别,在一个指针代表一个地址时候,并且是一个数组的名字时(也就是代表一个数组时,无论书一维还是多维的),他们在sizeof( )所计算时的结果将是不样的。

 

 

 

 

 

    再就是说下在函数的返回不管是数组名还是指针变量作为函数的返回值时都返回地址,所以对于sizeof( )计算后的结果最后应该就是一样的!

 

例如:

 

 

 

 

 

view plainc 

 

 

 

view plain#include<stdio.h> 

char *place_1(); 

char *place_2(char *); 

void main() 

{  

<span style="white-space:pre">    </span>        char a[5]={'a','b','c'}; 

<span style="white-space:pre">    </span>        char *p=a; 

<span style="white-space:pre">    </span>        printf("sizeof(a)          %d/n",sizeof(a)); 

<span style="white-space:pre">    </span>        printf("sizeof(p)          %d/n",sizeof(p)); 

<span style="white-space:pre">    </span>        printf("sizeof(place_1())  %d/n/n",sizeof(place_1())); 

<span style="white-space:pre">    </span>        printf("sizeof(place_2(p)) %d/n",sizeof(place_2(p))); 

char *place_1() 

<span style="white-space:pre">    </span>        char a[5]={'a','b','c'}; 

<span style="white-space:pre">    </span>        printf("sizeof(a)          %d/n",sizeof(a)); 

<span style="white-space:pre">    </span>return a; 

char *place_2(char *p) 

<span style="white-space:pre">    </span>        printf("sizeof(p)          %d/n",sizeof(p)); 

<span style="white-space:pre">    </span>        return p; 

 

 

运行结果如下:

 /

 

参考书目:《C程序设计(第三版)》,《C语言深度剖析》