一、指针
1. 指针运算
设p为指针,T为类型,n为整型数字,则p+n表示,指针从当前位置向后移动n个数据单位,而不是n个字节。
数据类型不同,移动的数据单位字节数也不同,实际上移动的字节数为n*sizeof(T)。
*与++的优先级相同,两者的结合性均是从右向左。
指向同一数组的不同元素的指针可以进行相减运算,结果为两个指针中相差元素的个数(即下标数相减)。
2.指针与数组
-
指针与一维数组
数组名不代表整个数组,只代表数组首元素的地址
int *p;int a[4];p=a的意思是把a数组的首元素地址赋值给指针变量p(以后其余的数组的元素的地址可通过指针的运算加法进行获取)。
指针相减:p1-p2,只有两者指向同一数组的元素时才有意义。
若int *p;int a[4];p=a;int i;则a[i],p[i], *(p+i), *(a+i)四者是等效的。 -
指针与二维数组
设有int a[3][4] ;int *p;
行指针:a+0代表第0行首地址,a+1代表第1行首地址,a+2代表第2行首地址,行指针的基类型int ( *p)[4]即包含四个元素的一维数组。
列指针:在行指针的前面加上 *号就表示列指针,如 *(a+0)表示第0行0列的首地址, *(a+1)表示第1行0列的首地址, *(a+2)表示第2行0列的首地址
3.字符指针变量
char * str=“hello world” 只是将字符串的首地址赋值给指针变量,字符串保存在静态存储区,字符串是不能改变的(即只能读不能改,但可以更改指针变量本身的指向),字符指针在使用scanf时,必须初始化(即赋值指向)
指针变量未赋值时不能使用下标法和地址法
- 指向函数的指针
定义格式:返回值类型 ( * 指针变量名)(参数类型)
使用函数指针:可以作为某一个函数的参数
可以把函数指针传入数组和结构体中 - 指针数组
即数组中的各元素均表示一个地址
格式:类型名 * 数组名(数组长度) - 多重指针
指向指针数据的指针变量 - 动态内存分配
内存分配函数