指针到底是什么
其实所有定义的变量都是地址,每个地址对应的内存中存放不同类型的数据,int a中存放的是一个实际的二进制数据。只是int* p中存放的是指向其他内存的地址而已。所以我们以后说一个变量的大小,其实就是说它对应内存的大小,对指针来说因为我们是64位计算机所以存储的是地址值为8Byte
指针和memet的关系
meset是按字节进行对一块内存地址初始化
void *memset(void *s, int c, size_t n);
s为需要分配的内存地址,c为分配的值,n为共分配几个字节。解释c:分配值是先把该值转换为补码,然后按照指定字节数n分配.比如:
int a[4];
memet(a, -1, 4),即初始化4个字节,每个字节都初始化为-1
得到11111111 11111111 11111111 11111111 00000000 00000000 ...剩余全为00000000
memset(a, 1 ,16),即初始化16个字节,每个字节都初始化为1
得到00000001 00000001 00000001...剩余全为00000001
然后输出a[0] = -1, 就和计算机默认的补码存储一样,用的时候取反加1。因为是int,一次取4个字节符号位不变取反加1,得到-1
我们知道空指针指向的地址应该为0x00000000 00000000 (注意这里是0x十六进制表示的),结合第一点我们知道这也代表该指针变量的内存中存储的应该是0x00000000 00000000
所以我们可以使用memset(p, 0, 8)使指针指向空
参考
对于非基本数值类型的memset
前面我们对于int,char这种基本数值类型可以很好的观察到memset后的结果。
对于struct进行memset我们首先要知道他们的内存分布方式,一般来理解,struct的内存肯定是由它的成员数据的内存堆叠起的一个整体,所以我们遇到struct的内存分布的时候按这个思路思考即可