指针:
1.所谓的指针,其实就是地址,地址是内存单元的编号
理解:
指针(地址)--作为内存单元的编号,本身也是一种数据,但是这种数据含义比较特殊 (理解:相当于是酒店的门牌号)
2.指针还是一种数据类型
专门用来保存地址这种的数据类型
指针 --->内存单元的编号 ----->一块内存空间对应
指针变量的定义:
语法:
基类型 * 指针变量名
(1)(2) (3)
(1)基类型 -- 表示 地址编号 所代表的那块空间 中要存放的数据的类型
(2) * -- 表示定义的变量,不是一般变量。而是指针类型的变量--意味着这个变量将来是存储 地址 这种数据的
(3) 指针变量名 -- 标识符,命名规则与变量名命名规则一致
int *p;//表示定义了一个指针类型的变量p
//既然是变量,则p一定有自己的一块空间
//这块空间是用来存放 地址的这种特殊的数据结构
//p变量,可以存放的是int类型的地址
//指针是一种数据类型,p是指向int型的指针类型
int a = 10;
int *p = &a;
64位一般指的是地址总线和数据总线的宽度
通过指针访问数据:
* 单目运算
作用: *地址值 => 访问到了地址值对应的那块空间
// 类似于在酒店中开一个对应地址房间&a的钥匙 通过它可以进入房间 对里面的事物进行操作
有了指针之后:
可以通过a变量名进行直接访问
可以通过p指针方式进行间接访问
指针:实现被调函数对主调函数的修改(核心用途)
注意:1要修改谁就把对应变量的地址传过去
2一定要对其做*运算
思考:&和*两个运算符优先级相同
int *p = &a;
&*p-- 先进行*p 就是变量a,再执行&运算,得到&a
*&p-- 先进行&p 得到的是p变量的基地址 再对其进行指针运算 得到&a
函数赋值注意:
void swap(int * pl,int * p2)
{int* temp;
*temp=*pl; I* 此语句有问题*/
*pl=* p2;
* p2= * temp;
* pl 就是 a, 是整型变量。而* temp 是指针变量 temp 所指向的变量。但 temp 中并
无确定的值(它的值是不可预见的),因此 temp 所指向的单元也是不可预见的。所以,对
* temp 赋值有可能给一个存储着重要数据的存储单元赋值,这样就会破坏系统的正常工
作状况。应该将* pl 的值赋给一个整型变量
知识点纠正
== 表示判断 优先级在<之后 在&之前 结合性从左到右
指针的运算
p+N //指针+数字
//含义:表示指向了第N个元素的位置
//数值上看,sizeof(基类型)*N
指针访问一维数组 *(p+i) <=> a[i] //等价 数组下标访问 本质上就是指针运算
总结:
1.指针
2.指针变量定义
基类型 * 变量名;
3.指针变量的引用
*指针变量名
*p //理解三步运算过程
4.指针的初始化
如果指针未初始化,此时指针变量中是个随机的地址 --- 野指针
为了让指针变量有明确的值,
int a = 10;
int *p = &a;
int *p = NULL;
5.应用
被调修改主调
使用方法:
a.要修改谁,把谁的地址传过去
b.被调函数中,一定要有 *运算
-----------------------------------
指针 + 数组
指针 + 函数
指针 + 指针