本课继续讲解了C语言的强制类型转换,之后介绍了结构体,数组以及结构体中的数组。
*和&的技巧
例1:
double d = 3.1416;
char ch = *(char*)&d;
取出d的地址,并重新解释为char型,然后解引用。由于double为8bytes,而char为1bytes,因此ch表示的是原来double中截取1bytes的结果。
例2:
short s = 45;
double d = *(double*) & s;
取出s的地址,并重新解释为double型,从2bytes变成8bytes,解引用后赋值给d。
字节存放顺序:大尾(big endian),小尾(small endian)
字节存放有大尾和小尾之分。如果对应数据的高字节存放在低地址就是大尾,反之,高字节存放在高地址的就是小尾。
例如:
short int a = 0x1234
大尾存放时:
偏移地址 存放内容
0x0000 0x12
0x0001 0x34
小尾存放:
偏移地址 存放内容
0x0000 0x34
0x0001 0x12
结构体
struct fraction{
int num;
int denom;
};
fraction pi;
pi.num= 22;
pi.denom= 7;
(fraction*) & (pi.denom)) -> num = 12;//取pi.denom的地址,并重新解释为fraction,因此变为8bytes(含两个int型变量num和denom),然后将位于低字节的num赋值为12。
(fraction*) & (pi.denom)) -> denom = 33;//同理,将位于高字节的denom赋值为33。
//同理,将位于高字节的denom赋值为33。
数组
int array[10];
array[0]= 44;
array[9]= 100;
array[5]= 45;
array[10]= 1;//合法代码
array[25]= 25;//合法代码
array[-4]= 77;//合法代码
关于c语言中数组没有边界检查这个问题可以参考
强制类型转换时需要注意字节问题:
int arr[5];
arr[3]= 128;
((short*)arr)[6]= 2;//arr被重新解释成2bytes的short型,此时,之前赋值128的地方变为arr[7]
cout<< arr[3] << endl;//输出的值为2的9次幂加上128
//arr被重新解释成2bytes的short型,此时,之前赋值128的地方变为arr[7]
cout<< arr[3] << endl;//输出的值为2的9次幂加上128
结构体中的数组
struct student{
char *name;
char suid[8];
int numUnits;
};
studentpupils[4];
pupils[0].numUnits= 21;
pupils[2].name= strdup (“Adam”);
pupils[3].name= pupils[0].void +6;
strcpy(pupils[1].suid,“40415xx”);
strcpy(pupils[3].name,“123456”);
pupils[7].suid[11]= “A”;
内存大致可以如下图所示:
void swap(int *ap, int *bp) {
int temp = *ap;
*ap = *bp;
*bp = temp;
};
这个swap函数是为了说明:数据类型并不重要,重要是数据的二进制字节数。