指针
指针基础知识
指针是一个地址
指针变量是存放地址(指针)的变量
指针变量的定义:
基类型 *变量名;
&变量名
Int a; int * p = &a;
Int *p; int a; p = &a;
无类型指针
Void*
指向void 的指针,简称void 指针。Void 被称为万能指针
Void 指针指向一块内存,却没有告诉程序该用何种方式来解释这块内存。因此,不能用这种类型的指针直接获取所指内存的内容,必须先转成合适的具体类型的指针才行
若想声明一个可以接受任何类型指针参数的函数,可以将所需的参数设定为void指针
比如 void*memset(void * s,int c, size_t n);
空指针
NULL是宏定义 即 0 ;
野指针
指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
访问指针变量的内容
*指针变量;
指针的运算
与整数进行加减运算,实际上是将指针进行上移,下移操作。同类型指针进行相减运算,其结果是两个指针的地址之差除以指针基类型所占字节数,同类指针关系运算 可以进行 == != < > <= >=
小结
指针定义时最好初始化
同类指针没有相加运算
对于两个毫无关联的指针比较大小是没有意义的
二维数组与指针
第一种是行指针,它使用二维数组的行地址进行初始化;
第二种是列指针,它使用二维数组的列地址进行初始化。
基类型(*变量名)[常量N];
例如:
Int (*p)[4]
Int a[3][4];
Int (*p)[4] = a;
或者 int (*p)[4] = &a[0];
通过数组名访问元素a[i][j];
a[i][j] *(a[i] + j) *(*(a + i) + j) (*(a + m))[j]
通过行指针p访问元素a[i][j]
P[i][j] *(p[i]+j) *(*(p + i)+ j) (*(p+i))[j];
将二维数组赋值给指针
Int a[3][4];
Int *p;
P = &a[0][0];
如何通过指针引用二维数组a的元素a[i][j];
1.*(p+i*4 + j)
2.P(i*4 + j)
指针函数
基类型 * 函数名(参数列表);
函数指针
返回值类型(*变量名)(参数列表);
用函数指针引用函数
Int func(int a,int b )
Int (*p)(int,int);
P = func;
函数指针作为函数参数
指向函数的指针变量的一个重要作用是把函数的地址作为参数传递到其 他函数。函数指针作为函数参数,把函数的入口地址传递给形参,这样就能在被调函数中使用实参函数了。
void func(int(*p)(int, int), int b, int n)
指针数组的定义
一个数组,若其元素均为指针类型数据,该数组称为指针数组,也就是
说,指针数组中的每一个元素都存放一个地址,该数组元素相当于一个
指针变量。定义一维指针数组的语法格式如下。
基类型 * 变量名[数组长度];
需要注意是的,数组指针和指针数组不是同一个概念,数组指针是一个
指向数组的指针,指针数组是指数组中的元素类型都是指针类型。
二级指针
当一个指针指向的变量是个指针变量时,这个指针就是一个指向指针的
指针,也就是二级指针,而该指针类型的变量就是二级指针变量。定义
二级指针变量的语法格式如下所示。
基类型 **变量名