1.为什么指针站4byte?
在32bit系统中,指针占4byte;在64bit中指针占8byte;
解释:1.指针是int类型的,32bit中int是4byte的,所以指针是4byte的;
2.32bit系统的内存寻址空间是2^32;所以用4byte=32bit的空间去映射机器的内存地址。
2.float的精确度是8位,为什么与‘零’比较时 0.00001只是5位?
解释:1.根据需求确定要达到的精度误差就行了。 比如你的误差允许范围为千分之一,那和0.0001比较就好了。
2.x==0.0f也可以直接实现。
3.指针函数:是指带指针的函数,即本质是一个函数。函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
如:int *pfun(int, int);
函数指针:因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。
函数指针作为参数:int getmax(int i,int j,int k,int (*p)(int ,int)); 使用:ret=getmax(i,j,k,get_big);只需要传入函数名作为函数首地址指针就行了。
返回函数指针的函数:int (*get_funtion(int a))(int i,int j);
int (*p)(int ,int);
p=get_funtion(100);// 这里的get_funtion(100)仅仅作为函数名,将函数的返回指针的值作为另一个函数的首地址,
max=p(i,j);
4.内存对齐可以用一句话来概括:
“数据项只能存储在地址是数据项大小的整数倍的内存位置上”
例如int类型占用4个字节,地址只能在0,4,8等位置上。
理论上是需要在物理内存上的位置是k的整数倍,但是分析的时候使用默认从1开始计数。
不同编译器中的k:
1、对于microsoft的编译器,每种基本类型的大小即为这个k。大体上char类型为8,int为32,long为32,double为64。
2、对于linux下的gcc编译器,规定大小小于等于2的,k值为其大小,大于等于4的为4。
这里不用管这个,只需要考虑最大的一个类型对其就可以了。由于字符数组中每一个元素都是1byte,因此可以讲字符数组元素拆分出来对其,只要保证最后结果是最大类型的整数倍就行了。
struct xx{
char b;
int a;
int c;
char d;
};
sizeof(XX)=16;
struct xx{
char b;
char d;
int a;
int c;
};
sizeof(XX)=12;