深入谈谈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++ ,