一. 指针总结
1.指针概念
a.指针 --- 地址 ---内存单元编号
b.指针 --- 数据类型 ---指针类型
不同语境:
定义一个指针 //指针类型的变量
打印某个变量的指针 //指针 --地址
2.指针变量的定义
基类型 * 变量名
a.基类型
数据类型
基本数据类型
数组类型
指针类型
b. * //定义时候的 * 表示定义的是一个 指针类型的变量
c. 变量名eg:
int a,b,*p,*q; //p和q都是指针类型的变量 ;a,b是 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 --- 偏移了一个积累性通过指针访问到数组元素:
5.指针运算&
*
p+1
p++
p-1
p--
p-q 前提: 同一类型的指针才能相减, 相减的结果表示之间差了几个基类型的空间p+q 指针不能做加法运算
迭代
b e
1 2 3 4 5 6 7 8 9 10
b e
1 2 3 4 5 6 7 8 9 10
........b
e
1 2 3 4 5 6 7 8 9 10练习:逆序,以迭代实现
作业:
迭代的方式 ,实现选择 冒泡 插入
思考题:
二分查找 用递归方式实现
注意:函数头中定义了返回值的类型,这说明函数是有返回值的,而函数体中并没有写return
此时函数会把所执行的最后一句代码的值作为返回值带出来。
6.指针 + 一维字符型数组
char s[] = "hello";char *p = s; //s数组名 --- 代表 数组首元素的地址
//s[0] --->类型 char型
//&s[0] --->char * //地址类型
练习:
实现一个输入操作练习:
字符串逆序 ---通过指针
b e
"hello" // h e l l o '\0'
7.const
int puts(const char *s)
{
}//const char *s --在函数里面 不能通过*s修改到外面的数据
就近原则 -- 离谁近,就限定谁的
const int *p = &a; //表示限定 基类型 为只读变量(无法通过*p修改,但可通过对a赋值修改)
int const *p = &a; //表示限定 基类型 为只读变量int *const p = &a; //限定p为只读
const int * const p = &a; //p不能被修改,指向的目标类型不能被修改 (是不能通过*p,但可通过赋值)
const char *p = "hello" //hello为常量,存储在常量区,无法通过*p修改const char s[ ] = "hello" //s开辟在栈上,hello存储在常量区,相当于复制了一份常量区上的数据初始化了一下s那块空间
好处:
1.可以接收 字符数组名 //char *
也可以接收 字符串常量 //const char *
提高了参数的适用性
2.避免了 可能出现的修改的操作
可以将 运行时的错误,提前到 编译时发现
const char * p 可以用来保存字符串常量的地址
8.快速排序