C语言第八章:指针

第一节指针
什么是指针:指针就是地址
int *pi; //一个指向整形变量的指针
一、 理解地址
1、 每个内存单元都有地址,地址是不会变的,但是地址的内容是不确定的。
2、 地址就是指针,也就是内存单元的编号。
3、 内存单元的地址和内存单元的内容是不同的概念。
4、 “无指针,不自由”出自书《指针的艺术》
二、 使用指针的好处
1、 让函数有多个返回值
2、 使函数有修改变量的灵活手段
3、 可以改善某些子程序的效率
4、 为动态数据结构(二叉树、链表)提供支持
三、 变量的存取方式
分类:直接存取(变量的赋值和取值)和间接存取(通过地址去获取存储单元的值)
四、 指针变量的概念
1、 指针变量存的是一个内存单元的地址,严格意义上说指针就是一个地址,是一个常量。
2、 如何去定义一个指针变量 包括:类型说明符 ,指针变量名 ,变量值 ;一般格式:类型说明符 *变量名
3、 int *p //定义了一个整形变量 ,变量名是p,int表示,p只能存放一个int类型的变量地址
4、 注意事项:
1) 、* 表示定义的是一个指针变量,如果没有的话就相当于一个普通变量
2) 、指针变量不可以存放数值
3) 、指针变量范围有全局变量和局部变量
五、 指针变量的初始化
1、 一个*是指一级指针,指针变量的初始化有两种定义的同时初始化和先定义后初始化
1)、定义的同时 初始化: int a=5; int *p=&a; //p指向a,
2)、先定义后初始化 :int b=5; int *p; p=&b ;
3)、定义一个指针变量,但是不知道这个指针指向谁,定义:int *p2=NULL;//NULL是空(0)//含义:就是什么也不指。

  2、指针变量的使用:定义指针变量 --→初始化指针变量-----→使用指针变量(间接的存取单元的值)

3、 指针变量如果不初始化会有什么后果?
答:会产生垃圾值,也称为野指针。一定要避免野指针,可能会出现严重的后果
int p; int x=6; 正确的赋值是:p=&x; 错误 *p=x; 因为没有给p指向,它是一个野指针,会报错的
指针变量也是有地址的
4、 常见的易犯的错误:int *p5=1000;(错误写法)
5、 *指针变量 作用:获取指针变量指向的内存空间的内容
总结:*的两种用法
!)、用于定义一个指针变量
!!)、获取地址空间对应的值,同样也可以修改地址所对应的值
六、 使用指针实现两个数的交换
注意:传的是指针(也就是地址)
函数的实参和形参的类型要相同,比如地址就是指针 ,值就传值。
七、 指针的应用场景
1、 在被调函数中可以修改主调函数中的变量的值
2、 函数返回多个值
八、 二级指针
1、 概念:一个指针变量存放的是另一个指针变量的地址,则称这个指针变量是指向指针变量的指针。
九、指针为何要区分类型: 一个指针占8个字节。定义什么类型的指针就指向什么类型的变量。(为了防止数据引用错误)

结论:定义什么类型的指针就应该指向什么类型的变量。

应用:使用指针实现 函数中两变量值交换

第二节 数组指针

一、 数组指针
1、 数组指针的概念:一个指针变量指向一个数组元素。(指向数组的指针)
注意:1)、数组名不代表整个数组,只代表数组首元素的地址
2、 使用数组的指针引用数组的元素
3、 作用:使用数组指针间接的访问数组的元素。如int a[4]={1,2,3,4}; int *p=a;===⇒int *p1=&a[0]
4、 数组指针的用法: 记住:不是数值而是元素
1)、p+1 表示指向数组的下一个数组元素
2)、p-1 指向数组的上一个元素
5、 使用数组指针和使用数组名的区别
1)、数组指针可以进行自加和自减运算,而数组名不可以,因为数组名是常量。(学习误区:a数组名是一个常量,不能++)
2)、数组指针比数组名的功能多,可以直接操作地址。
6、 p是一个变量。既然是一个变量,它存放的数的值是可以改变的。
结论:引用数组元素的两种方法:指针法 ,数组名(下标法)a[i]=p[i]=*(p+i)
总结:对于一个一维数组来说,
1)、获取a[i]的地址有几种方法?取值就是在地址的基础上
答:a、&a[i]
b、a+i
c、int *p=a;
p+i;

二、指针数组
指针数组:(存放指针的数组)一个数组元素值(内容)为指针的数组。指针数组是一组有序的指针的集合。相当于存放地址的数组 指针数组的所有元素都必须具有相同存储类型和指向相同数据类型的指针变量。 指针数组就是一个二维数组
格式:int *pa[3] //存储的是3个整型的指针
解析:定义了一个指针数组,数组名是pa,可以用来存放3个指针(必须是整型变量的指针)。
三、 指针变量之间的运算
1、 两个指针之间的减法运算
1)、常见的用法:两个指针都指向同一个数组
i、判断两个指针变量指向的元素是否连续
ii、判断两个指针变量之间相隔几个元素
注意:两个指针变量之间没有加法(越界问题)
如果两个指针指向同一个元素,那么他们相减的结果是0
判断两个指针变量指向的元素是否相邻,他们相减的结果是1得绝对值。
2、 两个指针之间的关系运算
i、p1>p 1表示p1在高位 0表示p在高位或者在同一位置。
3、数组名访问二维数组
int ch[3][4]={};
1、注意数组名访问数组元素的几种方式:ch,ch[0],&ch[0],&ch[0][0],*ch
2、数组元素地址的几种表示:**ch,*ch[0],ch[0][0]

四、 二维数组指针
1、数组名是指向行 的!! 也就是说数组指针指向一维数组的指针,行指针,用来指向二维数组的每一行,存放的是行的首地址。
格式:数据类型
数据类型 (*变量名)[二维数组列数]
3、 二维数组指针的初始化
int (*p)[4]=a;
2、二维数组指针的使用
(p+i)+j) ===⇒ *(p+i)
4、指针数组和二维数组指针的区别?
I、int *pa[3]={&a,&b,&c}//指针数组
II、int (*pa1)[3]=a;//二维数组指针

五、 字符串指针介绍及使用
字符串指针格式:char *变量名=“字符串内容”//内容是常量。

1、定义:char *p=”you

”; 这个字符串存储在常量区,p值保存了字符串常量的首地址,指针都占用8个字节,p是一个指针变量,值是可以改变的。
2、字符串指针的作用:用来保存一个字符串
注意:1、使用字符串指针存的是字符串的地址(常量区),只能通过地址的取值去实现遍历,它是不可以被更改得,是只读的。
2、字符数组存在栈区,可以更改
3、从键盘输入不能用字符串指针去保存。Char *str;

但是:可以用str=malloc(100)去申请100个字节的内存,这样就可以输入接收了;也可以先指向一个字符数组,在利用变量去实现接收。

str=malloc(100);的头文件是#include

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值