编程范式(斯坦福大学)学习笔记《三》

本课继续讲解了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语言中数组没有边界检查这个问题可以参考

c/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函数是为了说明:数据类型并不重要,重要是数据的二进制字节数。

猜你喜欢

转载自blog.csdn.net/dakin_/article/details/80977242