1指针
1.1语法:
【基类型*指针变量名】
【int *p=&a】
1.2语义:
【基类型】:指针变量指向的目标的数据类型
【*】:表示此时定义的变量是一个指针类型的变量
【&a】:一块存放着int类型数据的空间的地址
【*p】:
通过指针间接访问变量的过程:
(1)首先拿出p指针变量中的值(地址)到内存中定位(找内存单元的编号)
(2)从定位处开始,偏移出sizeof(基类型)大小的一块空间(确定所需内存空间大小)
(3)把这块空间当做一个基类型的变量来看 (检索存储值)
1.3指针变量的应用:
1.3.1在函数间传递信息(被调函数修改主调函数的数据)
1.两步:
(1)将主调中想被修改的变量的地址传给被调(【&】传址)
(2)必须要做【*】运算(间接访问),实现修改(【*】改值)
2.练习:
1:求两个数的和
2:求两个数中的大值,小值
3:使用指针将数组逆序
1.3.2用于处理数组的函数中
1.通过指针传递地址,函数可以直接操作源数据。(效率高)
2.要注意使用【const】关键字保护数组中的数据。
3.使用递增递减指针操作数组需要注意越界问题,c只保证指向数组及数组后面第一个位置的指针有效。
1.4指针相关操作
1.4.1取地址
【&】:
1.4.2间接访问数据(解引用)
【*】:*运算符给出指针指向地址上储存的值
注意:
(1)未初始化的指针解引用的结果是未定义的(随机值)。
1.4.3指针与整数相加
【p+1】:地址偏移
【p-1】:如果相减的结果超出了初始指针所指向数组的范围,计算结果是未定义的。
1.4.4递增指针
【p++】:
【p--】:
1.4.5指针的关系运算
【>】:
【>=】:
【<】:
【<=】:
【==】:
【!=】:
1.4.6指针减指针
前提:两个指针是同一类型的指针
【p-q】:表示指针之间差了几个基类型。
【p+q】:指针不能做加法运算。
1.5指针中的优先级问题
1.【*】的优先级高于【+】。
2.【*】和【++】的优先级相同,结合性是从右至左。
3.【*】的优先级低于【[]】。
1.6指针的应用
1.6.1系统数据存储方式(大小端)
补充:
(1)野指针:指针指向不明确,随机;故通常将指针初始化为NULL;【NULL】:表示0号地址
(2)未初始化的指针,不要进行解引用。(值存储的位置不明确)
(3)数组的越界指针只有一个可以进行解引用:C只能保证指向数组任意元素的指针和指向数组后面第1个位置的指针有效。
(4)指针变量的格式转换说明:
【%p】:
【%u】:
【%lu】:
2指针与数组
2.1数组指针
2.1.1一维数组
【int (*p)[2];】:p指向一个内含2个【int】类型值的数组的指针。
详解:p是一个指针,指向一个数组,该数组有两个元素。
2.1.2二维数组
【ar[3][2]】:ar是指向数组的指针,该数组内含2个int类型的元素
2.2指针数组
2.1.1一维数组
【int *p[2];】:p是一个内含2个指针的数组,每个指针都指向【int】类型的元素。
2.1.2二维数组
3指针与指针
3.1
3.2二级指针
3.2.1语法
【基类型 **p;】
基类型:指针类型
p:二级指针变量名
3.2.2语义
指向指针的指针,用于指向一个指针的地址
理解:
1.指针变量
2.指针变量的地址【*p】:一级指针本身
【**p】:二级指针所指向的变量值
【**p=a *p=&a p=&*p】
【**p】: 二级指针变量(p)中存放的是一级指针变量(*p)的地址(&*p),一级指针变量(*p)中存放的是基类型变量(a)的地址(&a),基类型变量的值(**p)。
【ar[i][j]】:二级指针变量(ar)中存放的是一级指针变量(ar[i])的地址(&ar[i]),一级指针变量(ar[i])中存放的是基类型变量(a,b,c,d...)的地址(&a,&b,&c,&d...),基类型变量的值(ar[i][j]),即(a,b,c,d...)。
3.2.3二级指针的应用
(1)二级指针主要用于多级数据之间的传递。
(2)传递一级指针的地址进函数,从而在函数内改变函数外一级指针的值,而一级指针的值可能为某个变量的地址。
4指针与函数
5.指针与【const】
5.1一级解引用
在一级解引用的前提下:
(1)【const】限定的指针可以指向普通指针和【const】限定的指针
(2)普通指针(非【const】限定的指针)只能指向普通指针
参照:【c primer plus 第6版-10.6.2-P557】
(3)【const* p】:不能改变指向的值。
(4)【*const p】:不能改变指向的地址。(理解:【*p】是取值,【p】是取地址)
6指针的兼容性
(1)不同的指针类型不具有兼容性(如int类型的指针不能兼容double类型的指针;指向指针的指针与指向数组的指针)
(2)