当前位置:编程学习 > C/C++ >>

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

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

 

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+

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,