一、指针的基本概念(理解)
(1)指针就是地址,地址就是指针。地址就是内存单元的编号,是从0开始的非负整数。
没有内存就没有指针,指针必须指向一块在程序中申请过的内存空间,这个指针才能使用,而不是野指针;
其实内存空间就相当于一个房间,每个房间都有门牌号,而指针就是房卡,房卡上写着门牌号, 你拿着房卡啥都干不了 必须打开门进去,才能对房间里的东西进行操作
(2)在C语言中,每个变量的最终存放的地方就是芯片的地址,每个地址就相当于一个编号,而指针的作用就是直接指向该地址,获取地址上的值。对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。
(3)在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
(4)一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。
(5) 既然指针变量的值是一个地址, 那么这个地址不仅可以是变量的地址, 也可以是其它数据结构的地址。指针变量存放一个数组或者函数的首地址,就可以找到改数组或者函数,因为内存存储都是连续存放的。
(6)一种数据类型或数据结构往往都占有一组连续的内存单元。 用“地址”这个概念并不能很好地描述一种数据类型或数据结构,而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址,它是“指向”一个数据结构的。
二、指针的定义
指针即指针变量,用于存放其他数据单元(变量/数组/结构体/函数等)的首地址。若指针存放了某个数据单元的首地址,则这个指针指向了这个数据单元,若指针存放的值是0,则这个指针为空指针 定义一个指针变量:
基类型 * 指针变量名;
(1) (2) (3)
(1) 基类型 ---- 基类型表示 地址(指针) 指向的目标空间存储的数据的类型
(2) * ---- 表明此时定义的变量 为指针类型的变量
(3) 指针变量名 --- 是一个标识符 (标识符符合命名规则)
int a = 10;
&a
int * p; //定义了一个指针变量 p
//指针变量p要指向的是 int型的一块空间
int * p = &a; //说 p 指向了 a
指针的使用方式
变量
数组
函数
指针 + 变量
指针 + 数组
指针 + 函数
指针 + 指针
4. 指针的核心用途
被调 修改 主调
注意:
1.要修改谁,把谁的地址传过去
2.被调函数中,一定要有对应 *p(间接访问)的操作
函数带出结果的方式:
1. return 结果
2. 可以通过指针带出 不止一个结果
time_t time(time_t *tloc)
time_t t = time(NULL) //
int main()
{
int a = 10;
int b = 20;
xxx 交换
printf("a = %d b= %d\n",a,b);
}
5.指针运算
&
*
p+N //N是个数字
p-N
p++
p-- //结果 -- 表示 指针加了 N个 基类型的大小
p+q //不能计算
p-q //结果 -- 表示差了几个基类型 (前提: 同类型的指针)
> >= < <= == !=
p > q //
5.指针操作数组
数组特点:
连续性
单一性
有序性
只要能获得第一个元素的地址
int a[10]
数组名 -- 代表的值 ---首元素的地址
&a[0]
a[i] <=> *(p+i)
i[a] <=> *(i+p)
a[i] //本质就是一个指针的运算
全局变量 和 静态变量 //静态区 -- 未初始化 -- 通通都是 0
局部变量 //栈 -- 未初始化 -- 随机值
总结:
1.指针
指针概念
指针类型 (地址) --- 具有指向含义的数值
2.定义指针变量
基类型 * 指针变量名;
a.基类型 //指针
b. * // *
c.指针变量名
int *p; //p本身
//p指向的目标对象
int a = 0x12345678;
char *p = (char *)&a;
*p
printf("*p = %d\n",*p);
[0x12] <-0x1000 p
[0x34] 0x1001
[0x56] 0x1002
[0x78] 0x1003
3.指针核心用途
被调 修改 主调
要求:
1. 要修改谁,就把谁的地址传过去
2. 被调函数中,一定得有对应的 间接访问(*p) 的操作
4.函数传参
值传递 ---- 实参的值给到了形参
地址传递 ---- 实参地址传给了形参 --- *p --- 可以实现被调修改主调
5.指针的运算
&
*
+N
-N
++
--
p-q
关系运算 > >= < <= == !=
6.指针操作数组
数据特点
指针的运算
只需要 指导 首元素的地址
a[i] <=> *(p+i)