一.指针的定义与使用:
1.指针的初始化与赋值:
若指针变量即没有初始化也没有赋值,则其指向的内存单元是不确定的,这时如果要操作指针就
会出现问题,因此指针要先赋值(明确其指向哪)
在进行赋值的时候要注意:
(1).保证指针指向一个合适的值
(2).指针类型一致才能赋值
int a = 10;
int *p = a;
int b[2] = {0};
int *p = &b;//错误,b是数组类型,&b是一个数组类型的地址
(3).void类型的指针,可以存储任何类型的地址
void v;//错误,不能定义void类型的变量
void *vp;//注意,void类型的指针 不能解引用
2.指针运算:
(1). & 和 *
(2).指针与整数的加减法:指针存储的是变量的内存地址,指针加减是指针向前或向后移动n个
sizeof大小的存储单元
int a = 10;
int *p = &a;
p = p+1; //指针向后移动4个字节
(3).指针的自增自减运算:
int a = 10;
int *p = &a;
*p++; //先读取p指向的变量5,然后指针向后移动4个字节
*p++ = *q++ //等价于 *p = *q; p++; q++
(4).两指针相减
结果为一个整数,表示指针之间的数组元素的个数
(5).void类型的指针
在使用时只有通过强转才能使得 void* 得到具体变量的值
二.指针与字符串
(1).char str[12];
cahr *p_str;
strcpy(p_str,"hello"); //野指针操作,因为p_str没有指向任何有效内存
(2).char *p = "hello";
char *q = "12345";
p = q; //只是将p指向了q,并没有将q赋值给p
char *p = "hello";
char *q = "12345";
while(*q) //字符串赋值
*p++ = *q++;
*p = '\0'; //加上字符串的结束标志
三.指针与数组
(1).一维数组的指针操作
a[10];
*(a+i); // 等价于a[i]
(2).指针数组:数组元素为一个个的指针
int *p[5]; //相当于5个 int *
(3).数组指针:是指向数组的指针
int a[5];
int (*p)[5];
p = &a;
四.指针与函数
(1).三个交换函数
(2).指针型函数:{ 写一个大数加法 char* lddd(char *s1,char *s2) }
int *head(int size); //head函数返回到一个int *
(3).函数指针: { 数据类型 (* 函数名) (参数列表) }
函数指针在使用之前也需要进行赋值,使指针指向一个已经存在的函数代码的起始位置
即: 函数指针名 = 函数名
调用函数指针指向的函数有如下两种格式:
1. 函数指针名(实参表);
2. (* 函数指针名)(实参表); //这种写法更好理解
int add(int a,int b);
int (*fptr)(int a,int b);
fptr = add;
add(1,2); //1
(* fptr)(1,2); //2
fptr(1,2); //3三种一样的
五.指针常量与常量指针
(1).指针常量:指针值不能被修改,所以保护指针的值不被修改
int a = 2;
int b = 3;
int *const p = &a; //p为指针常量并指向a的内存
p = &b; //错误,指针常量的值为常量,不能指向其他变量
p = NULL; //错误,指针常量的值为常量,不能被修改
(2).常量指针:指向常量的指针变量,保护指针指向的值不被修改
const int a = 2;
int b = 3;
const int *p = &a; //定义一个常量指针并初始化
p = &b; //正确,常量指针可以指向其他变量
p = NULL;//正确,常量指针可以被修改
(3).指向常量的指针常量:指向常量的指针,其指针本身也是常量
常指针常量:记忆特点:自己不能修改,指向的常量不能修改!!
定义格式: const 数据类型 *const 指针变量 = 变量名;
或
数据类型 const * const 指针变量 = 变量名;
const int a = 2;
int b = 3;
int *q = &b;
const int * const p = &a;//定义一个常量指针并初始化
p = &b; //错误,常指针常量的值为常量,不能指向其他变量
p = NULL;//错误,常指针常量的值为常量,不能被改变
*p = b; //错误,常指针常量指向的为值为常量,不能被修改
p = q; //错误,常指针常量的值为常量,不能被改变
q = p; //错误,两者的类型不同,一个为常指针,一个为非常指针