指针类型
指针是什么
C语言的指针类型包括两方面的信息:
一是地址,存放在指针变量中;
二是类型信息,关乎于读写的长度,没有存储在指针变量中,位于用该指针读写时的mov指令中,不同的读写长度对应的mov指令不同
//定义int类型的指针 int* p = &i;
指针为什么要有类型?
Answer:
因为指针存储的是一个内存地址,然而我们只根据一个地址读取对应的数据,但是你不知道什么时候读取完毕,也就导致了数据丢失,所以我们需要指定指针类型,确定什么时候读取完毕 。
例如:char 2字节 16位 int 4字节 32位
指针强制转换
指针也是一个变量,它自己占据一个4个字节的地址空间(由于程序的寻址空间是2^32次方,即4GB,所以用4个字节表示指针就已经能指向任何程序能够寻址到的空间了,所以指针的大小为4字节),他的值是另一个东西的地址,这个东西可以是普通变量,结构体,还可以是个函数等等。
由于,指针的大小是4字节,所以,我们可以将指针强制转换成int型或者其他类型。同样,我们也可以将任何一个常数转换成int型再赋值给指针。所有的指针所占的空间大小都是4字节,他们只是声明的类型不同,他们的值都是地址指向某个东西,他们对于机器来说没有本质差别,他们之间可以进行强制类型转换。
指针 to 指针 的强制类型转换是指将指针所指的内容的类型由原先的类型转换为后面的类型。
int a = 1; int *p = &a; float *p1 = (float*)p;
则p和p1的值都是&a,但是*p是将&a地址中的值按照int型变量进行解释,而*p1则是将&a地址中的值按照float型变量进行解释。
例子1:指针类型强制转换
int m;
int *pm = &m;
char *cp = (char *)&m;
pm指向一个整型,cp指向整型数的第一个字节。
例子2
struct str1 a;
struct str2 b;
a=(struct str1) b; //this is wrong
a=*((struct str1*)&b); //this is correct
空指针
鉴于指针之间这种灵活的强制类型转换的需求和出于简化代码的考虑,ANSI C引入了空指针即void*。
void指针又名万能指针,在现在的很多程序中,当参数不确定时就用万能指针代替,这一类的指针在线程\进程函数里特别常见。
空类型
一类函数,调用后并不需要向调用者返回函数值, 这种函数可以定义为“空类型”。其类型说明符为void,不需要向调用者返回函数值 。
void的语义有多种:
1、作为参数表示无参数
2、作为返回值代表无返回值
3、修饰指针变量代表未知类型的指针