C指针
(一)概念:所谓指针,就是地址,系统的内存空间,被分为许多的子存储单元(就像一栋楼被分为几个单元),指针标识了这个存储单元的位置,在这个存储单元中又有指令数据(哪个单元,这个单元里住了哪些人);存储单元的地址和存储单元的内容需要分清楚
一个变量的含义包含两个方面,一是以存储单元编号表示的地址;一是它指向的存储单元的数据类型(如何为数据分配指针,需要指明它的类型(不同类型在系统中所占的字节数不一样))
(二)用法:
(datatype)*(指针变量):指向类型为datatype的指针变量
()的优先级高于*
①:通过指针引用数组
int a[10]={1,2,3,4,5};
int *p; //定义指针变量
p=a; //将数组a的首地址赋给指针变量p保存或p=&a[0],&是取地址符号
可通过数组名和指针变量引用该数组
②:通过指针引用字符串
char s[]="This is a example!";//同上
char *p;
p=s;
可通过数组名和指针变量引用该字符串
③:指向函数的指针
int fun(int,int,int)
int (*p)(int,int,int) //p的类型是 int(*)(int,int,int),该函数返回的类型仍是int类型
p=fun; //将函数的首地址赋给p
可通过函数名和指针变量引用该函数
④:指针数组
datatype *数组名[数组长度]
int *p[100]; //数组里面存放的都是指针变量
⑤:多重指针
指向指针的指针:
datatype **指针名;
int *p[]
int **p; //相当于int *(*p),p是一个指向int(*p)类型的指针变量,int(*p)是指向int类型的指针变量,所以p是一个指向int类型的指针的指针
多重指针可以依次类推
⑥:动态内存分配
对内存的动态分配是通过系统提供的库函数来实现的,主要分为以下四类
1)malloc函数
void *malloc(unsigned int size):在内存的动态存储区域中分配一个长度为size的连续空间,函数的返回值为所分配区域的第一个字节的指针
若分配失败返回NULL(空指针)
2)calloc函数
void *calloc(unsigned n,unsigned size):在内存的动态存储区中分配n个长度为size的连续空
3)free函数
void free(void *p):释放指针变量p所指向的动态内存空间
4)realloc函数
void *realloc(void *p,unsigned int size):如果已经通过malloc函数或calloc函数获得了动态空间,若想改变其大小,可以使用realloc函数重新分配
指针变量=(转换类型)malloc|calloc|realloc
注意:当把void指针赋值给不同基类型的指针变量(或相反)是,编译系统会自动进行类型转换
例如:
int *p1;
void *p2;
p1=(int *)p2;
相当于p1=p2;系统会自动进行类型转换