第二十四讲 指针(一)PPT教学课件
合集下载
指针PPT(让你不再害怕指针)

• 首先从 P 处开始,先与[]结合(因为其优先级 比*高),所以 P 是一个数组
• 然后再与*结合,说明数组里的元素是指针 类型
• 然后再与 int 结合,说明指针所指向的内容 的类型是整型的
• 所以P 是一个由返回整型数据的指针所组成 的数组
2020/4/22
int (*p)[3];
<---描述一下变量p
2020/4/22
4 指针本身所占据的内存区
• 指针也是一个变量,指针也有自己所占据 的内存段,而这个内存段的长度是固定的,
可以用sizeof(指针的类型)测量一下,正如
前面所言,一台32位的机器,指针变量本 身占据的4个字节的长度。 • 指针本身占据的内存这个概念在判断一个 指针表达式(后面会解释)是否是左值 (可以被赋值的值)时很有用。
2020/4/22
指针与数据结构
• 指针的灵活,使得指针有着强大的功能, 因为指针是对动态内存操作的唯一手段, 所以指针不仅仅可以配合数组操作,还成 为一些高级数据结构的链接方式,比如链 表,树,图等。这些以后会涉及。
2020/4/22
指针与函数
• 总的来说,指针就是一种数据类型,一种 普通数据类型,它和别的数据类型一样, 可以成为函数的参数,可以成为函数的返 回值,用法和其他数据类型一样,不再讨 论。
• 然后再与*结合,说明指针所指向的元素是 指针
• 然后再与 int 结合,说明该指针所指向的元 素是整型数据
注意:由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更 复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.
2020/4/22
int p(int); <---描述一下p
• 从 P 处起,先与()结合,说明 P 是一个函数 • 然后进入()里分析,说明该函数有一个整型
C语言第7章指针第1讲课件.ppt

&用来取变量的地址 *用来取指针指向的内存中的内容
int i=3, *p; p = &i; printf(“*p=%d”,*p); int *p, a[10]; p = a; *p=20; 等价于 a[0]=20;
int *p, a[10]; p = &a[0]; *p=20; int *p, a[10]; p = &a[5]; *p=20;
2021/2/18
9
指针变量与其它类型变量的对比
共性
– 在内存中占据一定大小的存储单元 – 先定义,后使用
特殊性 – 它的内容只能是地址,而不能是数据 – 必须初始化后才能使用,否则指向不确定的存储单元,
对该空间进行访问,将可能造成危险
– 可参与的运算:加、减一个整数,自增、自减、关系、
赋值
– 只能指向同一基类型的变量
直接(寻址)访问
2000
– 通过变量地址直接存取变量内容2002 2004
间接(寻址)访问
– 通过指针变量来间接存取它所指
向的变量
3010
– i_pointer=&i;
┇ 3 6 9
┇ 2000
内存用户数据区
变量 i 变量 j 变量 k
变量 i_pointer
2021/2/18
5
指针(Pointer)的概念
第7章 指针 (一)
内容提要
指针概述 – 指针的概念 – 为什么引入指针的概念 – 指针变量作为函数参数 – 字符指针作为函数参数
指针和数组间的关系 – 一维数组的地址和指针 – 二维数组的地址和指针
2021/2/18
2
为什么引入指针的概念
铁杆C/C++程序员最挚爱的武器:指针 C/C++的高效、高能主要来自于指针 很多不可能的任务由指针完成
指针ppt课件

该一般形式说明以下几个方面的内容:首先定义变量为指针变量,其 次是该变量能指向一种指针对象,最后是被指向的指针对象能指 向的对象的类型。 例如 int **pp, *ip, i; ip = &i;
pp = &ip; 定义说明pp是指向指针的指针变量;它能指向的是这样一种指针对 象,该指针对象是能指向int型的指针变量。如上述代码让pp指向 指针变量ip,ip指向整型变量i。
int n;
int *p=&n;
int *q=p; int *px=0;是把一个指针初始化为空指针。
2020/12/13
面向对象程序设计
例1: 指针的概念 main() { int a; int *pa=&a; a=10; cout<<“a=“<<a<<endl; cout<<“*pa =“<< *pa <<endl; cout<<“&a =“<< &a <<endl; cout<<“pa =“<< pa <<endl; cout<<“&pa =“<< &pa <<endl;
y=++(*px) px 的目标变量的值加 1 后赋予 y。
2020/12/13
面向对象程序设计
(3)、 指针的相减 设指针p和q是指向同一组数据类型一致的数据,
则p-q运算的结果值是两指针指向的地址位置之间的 数据个数。
例: 统计输入字符串的字符个数 main() {char str[20]; char *p;
2020/12/13
pp = &ip; 定义说明pp是指向指针的指针变量;它能指向的是这样一种指针对 象,该指针对象是能指向int型的指针变量。如上述代码让pp指向 指针变量ip,ip指向整型变量i。
int n;
int *p=&n;
int *q=p; int *px=0;是把一个指针初始化为空指针。
2020/12/13
面向对象程序设计
例1: 指针的概念 main() { int a; int *pa=&a; a=10; cout<<“a=“<<a<<endl; cout<<“*pa =“<< *pa <<endl; cout<<“&a =“<< &a <<endl; cout<<“pa =“<< pa <<endl; cout<<“&pa =“<< &pa <<endl;
y=++(*px) px 的目标变量的值加 1 后赋予 y。
2020/12/13
面向对象程序设计
(3)、 指针的相减 设指针p和q是指向同一组数据类型一致的数据,
则p-q运算的结果值是两指针指向的地址位置之间的 数据个数。
例: 统计输入字符串的字符个数 main() {char str[20]; char *p;
2020/12/13
全的C语言指针详解PPT课件

在函数中使用指针参数
03
使用指针参数来访问和修改指针所指向的内容,需要使用“-
>”或“*”运算符。
05
指针的高级应用
指向指针的指针(二级指针)
定义与声明
二级指针是用来存储另一个指 针的地址的指针。在声明时, 需要使用`*`操作符来声明二级
指针。
初始化与使用
通过使用`&`操作符获取一个指 针的地址,并将该地址存储在 二级指针中。然后,可以通过 二级指针来访问和操作原始指
当使用malloc或calloc等函 数动态分配内存后,如果 不再需要该内存,必须使 用free函数释放它。否则, 指针将指向一个无效的内 存地址。
当一个指针在函数中定义 ,但该函数返回后仍然存 在并继续指向无效的内存 地址时,就会产生野指针 。
避免指针越界访问
总结词:指针越界访问是指试图访问数 组之外的内存,这是不安全的,可能会 导致程序崩溃或产生不可预测的结果。
指针与内存分配
通过指针来访问和操作动态分配的内存空间。指针可以 存储动态分配的内存地址,并用于读取和写入该地址中 的数据。
指向结构体的指针
01
定义与声明
指向结构体的指针是指向结构体类型的指针。在声明时,需要使用结
构体类型的名称来声明指向结构体的指针。
02 03
初始化与使用
通过使用`&`操作符获取结构体的地址,并将该地址存储在指向结构 体的指针中。然后,可以通过该指针来访问和操作结构体中的成员变 量。
```
பைடு நூலகம்
指向数组元素的指针
• 指向数组元素的指针是指向数组中某个具体元素的指针。通过将指针指向数组中的某个元素,可以访问该 元素的值。
• 指向数组元素的指针可以通过定义一个指向具体元素的指针来实现。例如,定义一个指向数组中第三个元 素的指针,可以使用以下代码
指针PPT(让你不再害怕指针)概要

2018/11/12
int (*p)[3];
<---描述一下变量p
• 首先从 P 处开始,先与*结合,说明 P 是一个 指针 • 然后再与[]结合(括号了改变优先级),说 明指针所指向的内容是一个数组 • 然后再与 int 结合,说明数组里的元素是整 型的 • 所以 P 是一个指向由整型数据组成的数组 的指针
2018/11/12
什么是地址
• 所有的变(常)量都是内存条中的一段01, 当我们使用这个量的时候,就是获取、使 用这段01。因此当我们想要访问这段内存, 就需要一个内存地址。这和我们想要拜访 一个人,需要知道他的门牌号一样。
ห้องสมุดไป่ตู้
2018/11/12
指针是一种存储地址的容器
• 指针是一种数据类型,我们可以特定数量 类型的变量称之为容器,比如int型变量是 一个存放整数的容器,double型变量是一个 存放小数的容器,而指针就是存放地址的 容器。 • 也正是因为指针可以存放地址,可以使用 地址,才成就了指针的特殊地位。 • 比如,指针让我们多了一种访问内存的方 式。
2018/11/12
我们一般不会用太复杂的类型,那样会 大大减小程序的可读性,请慎用,这上 面的几种类型已经足够我们用了。
2018/11/12
指针有四要素
• 指针是一种特殊的变量,它里面存储的数 值被解释为内存的一个门牌号(地址), 想要搞清楚一个指针,就需要搞清楚一个 指针的四要素!
2018/11/12
指针是一种访问内存的方法
• 我们使用变量一般是直接使用变量名,这 是因为编译器允许我们为一段内存起一个 “外号”,并使用这个外号直接访问内存 空间。你只需要使用外号,其他的编译器 为你搞定,这叫“直接访问”。 • 因为有了指针,我们也可以把这个内存的 “真实名姓”(地址),写在一个纸片 (存储地址的容器)上,通过寻址,间接 访问内存空间,这叫“间接访问”;
int (*p)[3];
<---描述一下变量p
• 首先从 P 处开始,先与*结合,说明 P 是一个 指针 • 然后再与[]结合(括号了改变优先级),说 明指针所指向的内容是一个数组 • 然后再与 int 结合,说明数组里的元素是整 型的 • 所以 P 是一个指向由整型数据组成的数组 的指针
2018/11/12
什么是地址
• 所有的变(常)量都是内存条中的一段01, 当我们使用这个量的时候,就是获取、使 用这段01。因此当我们想要访问这段内存, 就需要一个内存地址。这和我们想要拜访 一个人,需要知道他的门牌号一样。
ห้องสมุดไป่ตู้
2018/11/12
指针是一种存储地址的容器
• 指针是一种数据类型,我们可以特定数量 类型的变量称之为容器,比如int型变量是 一个存放整数的容器,double型变量是一个 存放小数的容器,而指针就是存放地址的 容器。 • 也正是因为指针可以存放地址,可以使用 地址,才成就了指针的特殊地位。 • 比如,指针让我们多了一种访问内存的方 式。
2018/11/12
我们一般不会用太复杂的类型,那样会 大大减小程序的可读性,请慎用,这上 面的几种类型已经足够我们用了。
2018/11/12
指针有四要素
• 指针是一种特殊的变量,它里面存储的数 值被解释为内存的一个门牌号(地址), 想要搞清楚一个指针,就需要搞清楚一个 指针的四要素!
2018/11/12
指针是一种访问内存的方法
• 我们使用变量一般是直接使用变量名,这 是因为编译器允许我们为一段内存起一个 “外号”,并使用这个外号直接访问内存 空间。你只需要使用外号,其他的编译器 为你搞定,这叫“直接访问”。 • 因为有了指针,我们也可以把这个内存的 “真实名姓”(地址),写在一个纸片 (存储地址的容器)上,通过寻址,间接 访问内存空间,这叫“间接访问”;
《指针》教学PPT课件

7 章
要传入首地址即可,否则,几乎不可能完成。
指
2.传出:函数通过return语句只能返回一个
针 数据。用指针可以得到多个运算结果(前面的例
题求一组数中的最大值、最小值和平均值)。
7.6 返回地址(指针)的函数
返回地址(指针)的函数特点:
第
定义函数时函数名前有*,这种函数返回的就是一
7 个地址,至于这个地址是一个数据的,还是一个数组的首
7.3 指针运算符及与之有关的运算
2.与指针有关的运算
第
(1)给指针变量赋值,例如int *p=&a;
7 章
(2)一个指针变量加或减一个整型值n,得
指
到与之相隔n个存贮区域的新地址;
针
main()
{ int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;
printf("%u,%u\n",a,p);
指针
本章内容
第 7.1 指针基本概念 7 7.2 指针变量的定义和初始化(P218-219)
章 7.3 指针运算符及与之有关的运算
指 针
7.4 指针和一维数组的关系
7.5 指针变量作为函数参数的作用
7.6 返回地址(指针)的函数
7.7 指针数组
7.8 动态申请存贮空间
7.1 指针的基本概念
第
1.指针的实质就是地址,指针变量就是用于
printf("%u,%u\n",&a[4],p+4);
getch();
}
7.3 指针运算符及与之有关的运算
2.与指针有关的运算
第
(3)一个指针变量可以做自加或自减运算;
7 章
C语言指针第讲PPT课件

int temp; temp = *x; *x = *y; *y = temp; }
temp
5
xy
&a
&b
ab
xy
第17页/共49页
简单变量作函数参数与指针变量作函数参数的比较
a
b
15
8
main
函数
Swap
函数
x
y
15
8
temp
a) 调用Swap函数
a
b
15
8
x②
8 ① temp 15
y 15
③
(b)执行Swap函数
主调函数
实参
main() {
int a, b; a = 15; b = 8; Swap(a, b); printf("a=%d,b=%d",a,b); }
a
b
5
9
形 参 被调函数
void Swap(int x, int y) {
int temp; temp = x; x = y; y = temp; }
为什么引入指针的概念
• 铁杆C/C++程序员最挚爱的武器:指针 • C/C++的高效、高能主要来自于指针 • 很多不可能的任务由指针完成
第1页/共49页
为什么引入指针的概念
• 指针 • 为函数提供修改变量值的手段 • 为C的动态内存分配系统提供支持 • 为动态数据结构(如例链表、队列、二叉树等)提供支持 • 可以改善某些子程序的效率
内存用户数据区
变量 i 变量 j 变量 k
变量 i_pointer
第3页/共49页
指针(Pointer)的概念
• 指针也是一种数据类型 • 指针变量
temp
5
xy
&a
&b
ab
xy
第17页/共49页
简单变量作函数参数与指针变量作函数参数的比较
a
b
15
8
main
函数
Swap
函数
x
y
15
8
temp
a) 调用Swap函数
a
b
15
8
x②
8 ① temp 15
y 15
③
(b)执行Swap函数
主调函数
实参
main() {
int a, b; a = 15; b = 8; Swap(a, b); printf("a=%d,b=%d",a,b); }
a
b
5
9
形 参 被调函数
void Swap(int x, int y) {
int temp; temp = x; x = y; y = temp; }
为什么引入指针的概念
• 铁杆C/C++程序员最挚爱的武器:指针 • C/C++的高效、高能主要来自于指针 • 很多不可能的任务由指针完成
第1页/共49页
为什么引入指针的概念
• 指针 • 为函数提供修改变量值的手段 • 为C的动态内存分配系统提供支持 • 为动态数据结构(如例链表、队列、二叉树等)提供支持 • 可以改善某些子程序的效率
内存用户数据区
变量 i 变量 j 变量 k
变量 i_pointer
第3页/共49页
指针(Pointer)的概念
• 指针也是一种数据类型 • 指针变量
C语言指针PPT

2023
c语言指针ppt
目 录
• 指针简介 • 指针的语法 • 指针的使用 • 指针的注意事项 • 指针常见错误 • 案例分析
01
指针简介
什么是指针
指针是一种数据类型
指针是C语言中的一种特殊数据类型,可以存储内存地址。
内存地址
指针所存储的内存地址通常是指向一个变量或数据的内存位 置。
指针的基本概念
指向函数的指针
指向函数的指针是指针变量中存储 了一个函数的入口地址。
指向指针的指针
指向指针的指针是指针变量中存储 了一个指针变量的地址。
02
指针的语法
指针的声明
指针的声明方法
使用 * 符号声明一个指针变量,例如:int *p; 表示声明一个指向整数的指针 变量 p。
指针变量的命名规范
指针变量的名称通常以 p_ 或 ptr_ 开头,以区分普通变量和指针变量。
05
指针常见错误
指针丢失
指针丢失是指在程序中忘记初始化指针,导致指针指向一个 随机的内存地址。
解决办法:在使用指针前,始终要对其进行初始化,可以将 其指向NULL或者一个有效的内存地址。
野指针
野指针是指指向无效内存区域的指针,这个内存区域没有 分配或者已经释放了。
解决办法:在释放内存后,立即将指针置为NULL,避免 其成为野指针。
指针的初始化
指针的初始化方法
使用 & 符号取变量的地址,然后将地址赋值给指针变量,例如:int a = 10; int *p = &a; 表示将变量 a 的地址赋值给指针变量 p。
空指针的初始化
使用 NULL 关键字初始化指针变量,例如:int *p = NULL; 表示将指针变量 p 初始化为空指针。
c语言指针ppt
目 录
• 指针简介 • 指针的语法 • 指针的使用 • 指针的注意事项 • 指针常见错误 • 案例分析
01
指针简介
什么是指针
指针是一种数据类型
指针是C语言中的一种特殊数据类型,可以存储内存地址。
内存地址
指针所存储的内存地址通常是指向一个变量或数据的内存位 置。
指针的基本概念
指向函数的指针
指向函数的指针是指针变量中存储 了一个函数的入口地址。
指向指针的指针
指向指针的指针是指针变量中存储 了一个指针变量的地址。
02
指针的语法
指针的声明
指针的声明方法
使用 * 符号声明一个指针变量,例如:int *p; 表示声明一个指向整数的指针 变量 p。
指针变量的命名规范
指针变量的名称通常以 p_ 或 ptr_ 开头,以区分普通变量和指针变量。
05
指针常见错误
指针丢失
指针丢失是指在程序中忘记初始化指针,导致指针指向一个 随机的内存地址。
解决办法:在使用指针前,始终要对其进行初始化,可以将 其指向NULL或者一个有效的内存地址。
野指针
野指针是指指向无效内存区域的指针,这个内存区域没有 分配或者已经释放了。
解决办法:在释放内存后,立即将指针置为NULL,避免 其成为野指针。
指针的初始化
指针的初始化方法
使用 & 符号取变量的地址,然后将地址赋值给指针变量,例如:int a = 10; int *p = &a; 表示将变量 a 的地址赋值给指针变量 p。
空指针的初始化
使用 NULL 关键字初始化指针变量,例如:int *p = NULL; 表示将指针变量 p 初始化为空指针。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⑶指针变量只能指向定义时所规定类型的变量,这 个规定的类型称为该指针变量的“基类型”。
如:上例中ptr1、ptr2只能指向整型变量,不 能指向实型或字符型变量。其“基类型” 相同,都是整型。
⑷定义指针变量后,并未确定该变量指向何处。也就 是说该变量的值是不确定的。在引用指针变量前必须 首先让它指向一个变量,这一点非常重要。
2020/12/12
2
预备知识
1. 内存的概念 内存:就是内部存储器,是由存储单元组成 的。它的特点是存储单元是线性连续 的。存储单元的最小单位是字节。
2020/12/12
3
2. 地址的概念
地址:为了访问内存中的某个存储单元,我们 要为它编号,这种编号称为内存地址。 通过地址我们就能够访问该地址所标 识的存储单元。
int *ptr1,*ptr2,*ptr3,x;
int ary[5]={2,4,8,16,32};
ptr1 = &ary[0] ;
ptr2 = &ary[3];
ptr3 = ary; x20=20p/1t2/r122 -ptr1;
x 的值是3
15
2.指针的++、 --、+=、-= 运 算 ++、 += :是移动指针到下一个或下几个存储单 元 --、。 -= :是移动指针到上一个或上几个存储单元。
元素。 2020/12/12
14
⑵指针与指针的加运算毫无意义,所以指针与指针 没有加运算。
⑶指针与指针的减运算要求相减的两个指针属于同 一类型,其结果是整数,表示两个指针之间的数 据的个数。其结果值的计算公式是:
ptr1-ptr2=(ptr1的值- ptr2的值) /指针的数据类型所占的字节数
例如:
⑵指针变量间的赋值和引用应保证基类型相同。
若有定义: int *p , i ; float *q , x ; 则:q=&i ; ╳ p=&x ; ╳
2020/12/12
13
㈢ 移动指针的运算
• 指针的加减运算(+、-)
• 指针的自加自减运算(++,--,+=,-=)
1.指针的+、-运算
+、-
说明:
例如:int *ptr, ary[5]={2,4,6,8,10} ;
ptr=ary; ptr+=3; ptr--;
想一想:*ptr++和(*ptr)++有什么 的区别 ?
2020/12/12
16
㈣关系运算
基类型相同的两个指针进行比较运算,其意义是 两个指针的位置比较,结果是逻辑值。
指针运算的程序举例:把a,b按大小顺序输出。
2020/12/12
9
二、指针变量的运算 ㈠ 指针运算符(“&”和“*” )
“&”(地址运算符) :取变量的存储地址。 例如:&a 是求变量a的地址。
“*” (引用运算符) :是取指针所指向变量的内容。
2020/12/12 ptr指向了i变量,*ptr表示i的值,即3 10
我们还可以用这种方法实现对变量的改变:
6
指针的对象:当把变量的地址存入指针变量后,我 们就可以说这个指针指向了该变量。
变量的存取方法:直接存取和间接存取。
直接存取:直接根据变量名存取数据。
间接存取:通过指针变量存取相应变量的数据。
2020/12/12
7
§10.2 变量的指针和指向变量的指针变量
一、指针变量的定义
一般形式: 类型标识符 *变量名 ;
2020/12/12
4
变量的地址:变量在内存中总占用几个连续的字 节,开始字节的地址,就是变量的地址。
2020/12/12
2007
存储单元
5
§10.1 指针及其相关概念
指针:一个变量的地址称为该变量的指针。 指针变量:若一个变量专用于存放另一个变量的 地址(指针),则该变量称为指针变量。
2020/12/12
例如: int *ptr1, *ptr2;
指针变量的类型:指明了该指针指向的内存空 间所存储的数据类型。
在定义指针变量时要注意以下几个问题:
⑴变量名ptr2前面的“*”不能省略,如果写成int
*ptr1, ptr2;则ptr2被定义为整型变量,而非整型指
针变量。
2020/12/12
8
⑵定义中的“*”表示所定义的变量是指针变量,但 指针变量名是ptr1、ptr2,而非*ptr1、*ptr2。
由此可见:通过指针
运算符“*”可以引用 一 个 变 量 。 如 : 当 ptr 已经指向变量i后, *ptr就等同于i。
*ptr=15 ; 等价于 i=15 ;
进一步理解“&”和“*”:
“&”运算和“*”运算是一对互逆运算。
&*ptr
&i
ptr
2020/12/12
*&i
*ptr
i
等价于 11
㈡ 指针的赋值运算(=)
说明:NULL是一个空指针,表示该指针变量的值没
有意义。作用是为了避免对没有被初始化的指针变
量的非法引用。NULL 的定义在“stdio.h”中。
2020/12/12
12
说明:
⑴在定义指针变量时,可以立即将一个地址值 赋给指针变量,这就是指针变量的初始化。 指针变量的初始化也是指针的赋值运算。
如:float flt,*f_ptr=&flt; 注意:这不是给*f_ptr赋值 。
指针的赋值运算:就是把地址赋值给指针变量。
指针的赋值运算可以是以下三种方式:
⑴使用取地址运算符,把地址值赋值给指针变量。
如:int i, *pi ; pi=&i ;
⑵把指针变量的值赋给另一个指针变量。
如:int i,*pa,*pb; pa=&i ; pb=pa;
⑶给指针变量赋值为符号常量NULL。
如:int *pi ; pi=NULL ;
指针±整数 指针-指针
⑴指针与整型值加减的结果是指针,表示使该指针
指向该指针下移或上移存储单元个数(整型值)之后
的内存地址。存储单元的大小就是该指针的数据类
型所需的内存大小。
例如:ptr+n (指针ptr,n为整数)这个指针值代表的
内存单元的地址是:ptr+n*d(其中d是指针所指向变
量的数据类型所占内存字节数),即指针移动了n个
第二十四讲 指针(一)
1、预备知识 2、指针及其相关概念 3、变量的指针和指向变量的指针变量
2020/12/
1
第十章 指 针
• 掌握指针与指针变量的概念; • 掌握数组的指针和指针数组的使用; • 掌握字符串指针和指向字符串的指针变
量的使用;
• 掌握指针函数和函数指针的使用; • 了解指向指针的指针的概念及其使用。
如:上例中ptr1、ptr2只能指向整型变量,不 能指向实型或字符型变量。其“基类型” 相同,都是整型。
⑷定义指针变量后,并未确定该变量指向何处。也就 是说该变量的值是不确定的。在引用指针变量前必须 首先让它指向一个变量,这一点非常重要。
2020/12/12
2
预备知识
1. 内存的概念 内存:就是内部存储器,是由存储单元组成 的。它的特点是存储单元是线性连续 的。存储单元的最小单位是字节。
2020/12/12
3
2. 地址的概念
地址:为了访问内存中的某个存储单元,我们 要为它编号,这种编号称为内存地址。 通过地址我们就能够访问该地址所标 识的存储单元。
int *ptr1,*ptr2,*ptr3,x;
int ary[5]={2,4,8,16,32};
ptr1 = &ary[0] ;
ptr2 = &ary[3];
ptr3 = ary; x20=20p/1t2/r122 -ptr1;
x 的值是3
15
2.指针的++、 --、+=、-= 运 算 ++、 += :是移动指针到下一个或下几个存储单 元 --、。 -= :是移动指针到上一个或上几个存储单元。
元素。 2020/12/12
14
⑵指针与指针的加运算毫无意义,所以指针与指针 没有加运算。
⑶指针与指针的减运算要求相减的两个指针属于同 一类型,其结果是整数,表示两个指针之间的数 据的个数。其结果值的计算公式是:
ptr1-ptr2=(ptr1的值- ptr2的值) /指针的数据类型所占的字节数
例如:
⑵指针变量间的赋值和引用应保证基类型相同。
若有定义: int *p , i ; float *q , x ; 则:q=&i ; ╳ p=&x ; ╳
2020/12/12
13
㈢ 移动指针的运算
• 指针的加减运算(+、-)
• 指针的自加自减运算(++,--,+=,-=)
1.指针的+、-运算
+、-
说明:
例如:int *ptr, ary[5]={2,4,6,8,10} ;
ptr=ary; ptr+=3; ptr--;
想一想:*ptr++和(*ptr)++有什么 的区别 ?
2020/12/12
16
㈣关系运算
基类型相同的两个指针进行比较运算,其意义是 两个指针的位置比较,结果是逻辑值。
指针运算的程序举例:把a,b按大小顺序输出。
2020/12/12
9
二、指针变量的运算 ㈠ 指针运算符(“&”和“*” )
“&”(地址运算符) :取变量的存储地址。 例如:&a 是求变量a的地址。
“*” (引用运算符) :是取指针所指向变量的内容。
2020/12/12 ptr指向了i变量,*ptr表示i的值,即3 10
我们还可以用这种方法实现对变量的改变:
6
指针的对象:当把变量的地址存入指针变量后,我 们就可以说这个指针指向了该变量。
变量的存取方法:直接存取和间接存取。
直接存取:直接根据变量名存取数据。
间接存取:通过指针变量存取相应变量的数据。
2020/12/12
7
§10.2 变量的指针和指向变量的指针变量
一、指针变量的定义
一般形式: 类型标识符 *变量名 ;
2020/12/12
4
变量的地址:变量在内存中总占用几个连续的字 节,开始字节的地址,就是变量的地址。
2020/12/12
2007
存储单元
5
§10.1 指针及其相关概念
指针:一个变量的地址称为该变量的指针。 指针变量:若一个变量专用于存放另一个变量的 地址(指针),则该变量称为指针变量。
2020/12/12
例如: int *ptr1, *ptr2;
指针变量的类型:指明了该指针指向的内存空 间所存储的数据类型。
在定义指针变量时要注意以下几个问题:
⑴变量名ptr2前面的“*”不能省略,如果写成int
*ptr1, ptr2;则ptr2被定义为整型变量,而非整型指
针变量。
2020/12/12
8
⑵定义中的“*”表示所定义的变量是指针变量,但 指针变量名是ptr1、ptr2,而非*ptr1、*ptr2。
由此可见:通过指针
运算符“*”可以引用 一 个 变 量 。 如 : 当 ptr 已经指向变量i后, *ptr就等同于i。
*ptr=15 ; 等价于 i=15 ;
进一步理解“&”和“*”:
“&”运算和“*”运算是一对互逆运算。
&*ptr
&i
ptr
2020/12/12
*&i
*ptr
i
等价于 11
㈡ 指针的赋值运算(=)
说明:NULL是一个空指针,表示该指针变量的值没
有意义。作用是为了避免对没有被初始化的指针变
量的非法引用。NULL 的定义在“stdio.h”中。
2020/12/12
12
说明:
⑴在定义指针变量时,可以立即将一个地址值 赋给指针变量,这就是指针变量的初始化。 指针变量的初始化也是指针的赋值运算。
如:float flt,*f_ptr=&flt; 注意:这不是给*f_ptr赋值 。
指针的赋值运算:就是把地址赋值给指针变量。
指针的赋值运算可以是以下三种方式:
⑴使用取地址运算符,把地址值赋值给指针变量。
如:int i, *pi ; pi=&i ;
⑵把指针变量的值赋给另一个指针变量。
如:int i,*pa,*pb; pa=&i ; pb=pa;
⑶给指针变量赋值为符号常量NULL。
如:int *pi ; pi=NULL ;
指针±整数 指针-指针
⑴指针与整型值加减的结果是指针,表示使该指针
指向该指针下移或上移存储单元个数(整型值)之后
的内存地址。存储单元的大小就是该指针的数据类
型所需的内存大小。
例如:ptr+n (指针ptr,n为整数)这个指针值代表的
内存单元的地址是:ptr+n*d(其中d是指针所指向变
量的数据类型所占内存字节数),即指针移动了n个
第二十四讲 指针(一)
1、预备知识 2、指针及其相关概念 3、变量的指针和指向变量的指针变量
2020/12/
1
第十章 指 针
• 掌握指针与指针变量的概念; • 掌握数组的指针和指针数组的使用; • 掌握字符串指针和指向字符串的指针变
量的使用;
• 掌握指针函数和函数指针的使用; • 了解指向指针的指针的概念及其使用。