回顾:
1.指针概念
a.指针 --- 地址 ---内存单元编号 //值
b.指针 --- 数据类型 ---指针类型 //类型
不同语境:
定义一个指针? //指针类型的变量
打印某个变量的指针? //指针 --地址
2.指针变量的定义
基类型 * 变量名
a.基类型
数据类型
基本数据类型
数组类型
指针类型
b. * //定义时候的 * 表示定义的是一个 指针类型的变量
c. 变量名
eg:
int a,b,*p,*q; //p和q都是指针类型的变量 *是修饰指针变量名的
int *p,q; //p是指针变量 q int型变量
注意:
1.指针变量的 大小 64位(8字节) 32位(4字节)
2.指针类型 --- 存储的是 地址 这种特殊的数据
指针变量的给值:
int *p; //野指针 --- 随机值 ---被当做了地址
//避免野指针 -- 一般初始化为NULL
*p
step1: 拿p中地址值 到内存中定位
step2: 从定位处开始,偏移基类型大小的一块空间sizeof(基类型)
step3: 被当做了基类型变量来看
*p 整体就是一个基类型的变量
3.核心用途(80%)
被调修改主调
修改:
1.修改谁,就传谁的地址
2.*p(间接访问)运算
4.指针 + 一维整型数组
指针 操作 一维整型数组
int a[10];
int *p = a;
//1.数组本身的特点 (连续性,单一性,有序性)
//2.p+1 --- 偏移了一个积累性
通过指针访问到数组元素:
*(p+i) <=> int型的变量 <=> a[i] <=>p[i]<=> *(a + i)
5.指针运算
&
*
p+1
p++
p-1
p--
关系运算
> >= < <= == !=
p>q
p-q
前提: 同一类型的指针
表示之间差了几个基类型
p+q //指针不能做加法运算
快速排序
指针 + 一维字符型数组
char s[] = "hello";
char *p = s; //s数组名 --- 代表 数组首元素的地址
//s[0] --->类型 char型
//&s[0] --->char * //地址类型
---------------------------------------------------------------------------------------
int puts(const char *s);
const char * s;
const int a; //只读变量
int a = 10;
const int *p = &a; //表示 基类型 为只读
p --- 指针变量 --本身的类型 int *
a --- int型变量 --本身类型 int
p = &a;
const int *p = &a;
int const *p = &a; //就近原则 -- 离谁近,就限定谁的
int *const p = &a; //限定p为只读
const int * const p = &a; //p不能被修改,指向的目标类型不能被修改
//(是不能通过*p)
int puts(const char *s)
{
}//const char *s --在函数里面 不能通过*s修改到外面的数据
好处:
1.可以接收 字符数组名 //char *
也可以接收 字符串常量 //const char *
提高了参数的适用性
2.避免了 可能出现的修改的操作
可以将 运行时的错误,提前到 编译时发现
const char * p 可以用来保存字符串常量的地址