C语言课件6-指针3
C语言完整 ppt课件
用一个标识符来表示一个字符串,称为“宏”,标识符称为“宏名”。在 程序中 用宏名替代字符串称为“宏调用”。在编译预处理时,将对程序中所有出现的 “宏 名”,都用宏定义中的字符串代换,这个过程称为“宏展开”。
1.4.1.1 不带参数的宏定义
格式为:#define 标识符 字符串
1.4.1.2 带参数的宏定义
1-4
1.3 C程序上机步骤
C源程序编好后,要经过编辑、编译、连接, 生成可执行文件后,才可运行。
运行集成开发软件
编辑源程序
编译
有 有错? 无 连接
不正确
运行
结果正确? 正确
结束
1-5
1.4 编译预处理
编译预处理是指,在C编译程序对C源程序进行编译之前,由编译预处理程 序对源程序中的预处理命令进行处理的过程。
1.2.1 C语言程序举例
1.2.2 C语言程序的结构
1.2.2.1 函数是C语言程序的基本单位。
1.2.2.2 函数的一般结构
任何函数(包括main()函数)都是由函数首部和函数体两部分组成。
1. 函数首部: 函数首部即函数第一行,由函数类型、函数名和函数参数表三部分组成。
2. 函数体: 函数体为函数首部下面的花括号{……}内的部分。 函数体一般由声明部分和执行部分构成:声明部分定义所用到的变量,声明所调用的函数等; 执行部分有若干语句组成。
2.6.1 运算符及表达式简介 2.6.1.1 运算符
C语言中的运算符具有2个特点: ⑴ 运算符的优先级 C语言中,运算符的优先级共分为15级,1级最高,15级最低。 ⑵ 运算符的结合性 C语言中各运算符的结合性分为左结合性(从左到右)和右结合性(从右到左)。 2.6.1.2 表达式 表达式是由常量、变量、函数和运算符组成的式子。 表达式求值是按运算符的优先级和结合性规定的顺序进行的。
C语言程序设计课件 .ppt
定义C为字符数组,包含10个元素。在赋值以后数组的状态 如图所示: c[0] c[1] c[2] c[3] c[4] c[5] c[6] c[7] c[8] c[9]
I
am
happ y
2020/4/12
24
2、字符数组的初始化
与一般数组的初始化方法类似。
例如char c[ ]={‘I’,’ ’,’a’,’m’,’ ’,’a’,’ ’,’s’,’t’,’u’,’d’,’e’, ’n’,’t’}
a[0] ---------------------- a 00 a 01 a 02 a 03
a
a[1] ---------------------- a 10
a 11
a 12
a 13
a[2] ---------------------- a 20 a 21 a 22 a 23
上面定义的二维数组可以理解为定义了3个一维数组,即 相当于 float a[0][4],a[1][4],a[2][4]
85 555 58 444 44 822 22 280 00 008
第第 第 第结 一二三 四 次次 次 次果
2020/4/12
11
根据流程图写出程序(今设n=10),定义数组长度为11, 本例中对a[0]不用,只用 a[1]到a[10],以符合人们的习惯。
流程图如下:
输入n个数给a[1]到a[n] for j=1 to n-1
for (i=1;i<=10-j;i++) if (a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf(“the sorted numbers :\n”); for (i=1;i<11;i++)
C语言指针详解
C语言指针详解1 程序如何运行当我们打开电脑中的任何一个程序运行时,我们的操作系统会将该程序存在硬盘的所有数据装载到内存中,然后有CPU 进行读取内存中的数据并进行计算,并将计算的结果返回给我们的操作系统,然后操作系统将相应的动作交付给相应的硬件来完成。
如:将声音数据交给声卡,最后有音响输出来,将图像交给显卡最后有显示器输出……但是还会有一部分数据会返回给内存,以供程序下面的语句继续使用。
我们都知道内存的容量有很大,如:4G,8G, 16G,有时候我们会打开很多的程序,所有的程序的数据都存放到我们的内存中,那么CPU是如何正确的读取我们的不同程序的数据并加以计算的哪?2 内存的假设设计为了让我们的CPU 可以很好的读取内存中的数据,内存必须做优化设计,于是给内存设定了集合设计,将我们的内存分成很多大小相同的方格(盒子),所有的数据将放入这些小盒子中,将不同的程序的数据放入到不同的小盒子中,这样就出现的模块化的内存,当我执行程序的一个命令时,CPU就会从相应的盒子读数据然后计算,由于我们硬件所能访问或计算的最小单位是字节,所以内存中的这样的一个小盒子的大小就给他规定一个字节。
3 地址和指针一般我们声明一块内存空间的时候,会给他取一个名字,为的是我们在编写程序的时候方便使用空间中存放的值,但是CPU 读数据的时候会忽视这个名字,因为CPU无法理解这样的数据,CPU 只能执行0,1代码,那么CPU是如何知道从什么地方读取数据,又到什么地方地址数据的读取的那,所以必须对内存做2次设计,就是将内存中分成的很多小盒子下面标注一些顺序的序号,例如:从第一个盒子开始,标注1,2,3,4,5,6,7,……每一个数字对应一个盒子,但是真正的内存如中不是使用这些十进制数字的,而是使用16进制整数表示的,如0x16ffee。
这些我们标记的数字就叫做内存中的地址。
由于这些地址和盒子是对应的关系,所以只要知道了地址,就可以得到对应盒子中存放的数据了,形象的说,我们说这个地址指向对应的盒子,在C语言中可以通过地址得到对应盒子的数据是*地址。
c语言ppt课件
编译器自动将一种数据类型转换为另一种数据类型。
自动类型转换
通过强制类型转换操作符将一种数据类型转换为另一种数据类型。
强制类型转换
03
程序流程控制
Chapter
依照代码的先后顺序执行,是最基本的程序流程结构。
顺序结构依照代码的顺序从上到下执行,每条语句依照出现的先后顺序执行,直到程序结束。
指针的算术运算
指针数组是指包含相同类型的指针元素的数组,可以通过数组索引访问各个指针,实现对数组元素的间接访问。
指针数组
使用malloc、calloc和realloc函数可以在运行时动态分配内存,这些函数返回一个指向分配内存的指针,可以通过该指针访问和操作内存。
使用free函数可以释放之前动态分配的内存,以避免内存泄漏。释放内存后,应将指针置为NULL,以避免野指针的产生。
打开文件
使用fclose()函数关闭已打开的文件,释放相关资源。
关闭文件
读取文件
使用fscanf()、fgets()等函数从文件中读取数据,并将其存储到变量中。
写入文件
使用fprintf()、fputs()等函数将数据写入文件中。
使用断点、单步执行等调试技能,检查程序中的错误和特殊。
使用try-catch语句或setjmp/longjmp函数,捕获和处理程序中的特殊情况。
C语言的发展经历了多个版本,从C89到C99再到C11,不断引入新的特性和标准。
C语言具有高效、可移植、可扩大性等特点,能够直接与硬件进行交互,合适开发操作系统、嵌入式系统、游戏、图形界面等。
01
02
C语言在计算机科学、电子工程、数学等领域有广泛应用,也是许多程序员入门的首选语言。
c语言ppt课件
汇编语言的应用场景
汇编语言主要用于系统软件、嵌入式系统等领域 。
C语言与汇编语言的混合编程方式
01
直接调用汇编代码
在C语言中直接使用内联汇编, 通过关键字__asm__将汇编代码 嵌入到C代码中。
02
通过函数调用汇编 代码
将汇编代码封装成函数,在C语 言中调用。
03
使用编译器特定的 语法
一些编译器支持特定的语法来混 合C语言和汇编语言,如GCC中 的asm()函数。
广度优先搜索
从根节点开始,逐层访问相邻的节点 ,直到所有的节点都被访问过。
05 C语言与汇编语言 的混合编程
汇编语言的概述
1 2
汇编语言定义
汇编语言是一种面向机器的语言,使用特定的符 号表示机器指令,如MOV, ADD, SUB等。
汇编语言的特点
汇编语言执行速度快,代码可读性较差,不易维 护。
3
嵌入式系统的概述
嵌入式系统的定义
01
嵌入式系统是一种专为特定任务设计的计算机系统,
通常具有体积小、功耗低、可靠性高等特点。
嵌入式系统的应用范围
02 嵌入式系统广泛应用于工业控制、智能家居、汽车电
子等领域。
嵌入式系统的硬件和软件
03
嵌入式系统的硬件通常包括微控制器、传感器、执行
器等,软件则包括嵌入式操作系统、应用程序等。
THANKS
感谢观看
搜索算法
顺序搜索
逐个比较待搜索元素与表中的每个元素,直到找到目标元素或搜索完整个表。
二分搜索
在有序表中,取中间位置元素,如果中间元素正好是要查找的元素,则搜索过程结束;如果待查元素 大于中间元素,则在右半部分继续查找;若待查元素小于中间元素,则在左半部分继续查找。
C++-第六章(共28张)
12
第12页,共28页。
6.3.2 指针变量(biànliàng)做函数形参
➢ 数组名代表数组首元素的地址。用数组名作函数 的参数,传递的是数组首元素的地址。
➢ 同理:用指针变量作函数形参,同样可以接收从实 参传递来的数组首元素的地址(此时,实参是数组名) 。
➢ *6.9 引用
2
第2页,共28页。
6.1 指针 的概念 (zhǐzhēn)
➢ 变量
➢ 内存单元地址
➢ 变量值(内存单元内容 )
3
第3页,共28页。
6.1 指针 的概念 (zhǐzhēn)
➢ 直接存取(直接访问)
➢ 在程序中一般是通过变量名来对内存单元进行存 取操作的。其实程序经过编译以后已经将变量名 转换为变量的地址,对变量值的存取都是通过地 址进行的。
➢ 指针变量也可以指向一个函数。一个函数在编译时 被分配给一个入口地址。这个函数入口地址就称为 函数的指针。可以用一个指针变量指向函数,然后 通过该指针变量调用此函数。
➢ 指向函数的指针变量的一般定义形式为
➢ 函数类型 (*指针变量名)(函数形参表);
例如:int (*p) (int,int);
17
表示第2、3、4直至第n行的首元素地址?
➢ 2.指向多维数组元素的指针变量
➢ 指向由m个元素组成的一维数组的指针变量可以定义 一个指针变量,它不是指向一个整型元素,而是指向
一个包含m个元素的一维数组。如果指针变量p先指向
a[0](即p=&a[0]),则p+1不是指向a[0][1],而是 指向a[1],p的增值以一维数组的长度为单位。
C语言指针讲解ppt课件
运行情况如下: 5,9↙ a=5,b=9 max=9,min=5 当输入a=5,b=9时,由于a<b, 将p1和p2交换。交换前的情况见图 (a),交换后见图(b)。
地址。
10.2.2 怎样引用指针变量
在引用指针变量时,可能有三种情况: ⑴给指针变量赋值。如:
p=&a; ⑵引用指针变量的值。如:
printf(“%o”,p); ⑶引用指针变量指向的变量。
有关的两个运算符: (1) & 取地址运算符。 &a是变量a的地址。 (2) * 指针运算符 (或称“间接访问”运算符),*p
1 2 3 4 5 6 7 10 9 0↙
1 2 3 4 5 6 7 10 9 0
10.3.4 用数组名作函数参数
在第7章中介绍过可以用数组名作函数的参数。 如: void main()
{if(int arr[],int n); int array[10]; ┇ f(array,10); ┇ } void f(int arr[ ],int n)
{ ┇
}
例10.7 将数组a中n个整数按相反顺序存放
#include <stdio.h> void main() { void inv(int x[ ],int n);
int i,a[10]={3,7,9,11,0, 6,7,5,4,2};
printf(″The original array:\n″); for(i=0;i<10;i++) printf (″%d,″,a[i]); printf(″\n″); inv (a,10); printf(″The array has been in verted:\n″); for(i=0;i<10;i++) printf (″%d,″,a[i]); printf (″\n″); }
指针ppt课件
可以通过将数组名赋值给指针变量来 初始化数组指针,例如 int *p = arr; 其中 arr 是数组名。
指向数组的指针
指向数组的指针的概念
指向数组的指针是指向整个数组的指针,可以通过将数组 名赋值给指针变量来获取整个数组的首地址。
指向数组的指针的初始化
可以通过将整个数组名赋值给指针变量来初始化指向数组 的指针,例如 int (*p)[5] = &arr; 其中 arr 是包含 5 个整 数的数组。
指针乘法和除法
指针的乘法和除法运算在实际编程中很少使用,因为它们的意义不太 明确。
指针的关系运算
01
关系运算符
包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等
。这些运算符可以用于比较两个指针所指向的内存地址的大小关系。
02
大于和小于运算
比较两个指针所指向的内存地址的大小,如果第一个地址大于第二个地
06 指针的高级应用
动态内存分配
动态内存分配的概念
动态内存分配是指在程序运行时,根据需要动态地分配或释放内 存空间的过程。
动态内存分配的方法
常见的动态内存分配方法有malloc、calloc、realloc和free等函数 。
动态内存分配的注意事项
在动态内存分配时,需要注意内存对齐、内存碎片化、内存泄漏等 问题,以确保程序的正确性和稳定性。
二叉树操作
二叉树的概念
二叉树是一种树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点 。
二叉树的创建与遍历
二叉树的创建需要为每个节点分配内存,并设置左子节点和右子节点的指针;二叉树的遍 历包括前序遍历、中序遍历和后序遍历等,需要遵循二叉树的结构和特性进行操作。
C语言07 指针
指针变量
定义指针变量: type *name
其中: Type可以是C语言中的任何一种有效类型 指针的基类型(type)定义了该指针可以指向的变
量的类型 从技术上讲,任何类型的指针均可指向内存中的任
何地址,但实际上,所有指针的运算都与它的基类 型相关,所以正确说明指针基类型十分重要 如:int *pointer_1; pointer_1可以指向整型变量,但不能指向浮点型 等其它类型的变量
用数组作为函数参数时,就把数组的地址传 给了函数 L8_7.c;L8_score.c;L8_matchChar.c
指针与数组
指针和数组是紧密相连的。一个变量有地址, 一个数组包含若干个元素,每个元素都有相应 的地址,指针变量可以指向数组元素,即:将 某一元素的地址放入一个指针变量中
int a[10]; 数组名a其实就是一个地址值(常量),记录
p的值为2000
p+1的值为2004
P-1的值为1996
越界!
通过指针引用数组元素
引用一个数组元素,可用下面两种方法: (1) 下标法,如a[i]形式 (2) 指针法,如*(a+i)或*(p+i)
其中: a是数组名,p是指向数组元素的指针变
量,其初值 p=a
L7_4.c,L7_5.c
字符串
在地址所标识的内存单元中存放数据,相当 于在旅馆房间中居住旅客
我们将内存单元的地址称为“指针”
如:变量A存放的是另一个变量B的地址,则 称A是B的指针变量,或A指向B
内存地址 1000 1001 1002 1003 1004 …… 8000 8001 8002
内存单元的值 8001
…… 20 36 10
使用指针变量自身的值(地址)
C语言程序设计教程完整全套教学课件pptx
C语言与高级语言的关系
探讨C语言与Java、Python等高级语 言之间的联系与区别,以及各自适用 的场景。
C语言的特点与优势
阐述C语言高效、灵活、可移植等特 点,以及在系统级编程、嵌入式开发 等领域的广泛应用。
计算机系统基本概念
1 2 3
计算机系统的组成
介绍计算机硬件系统的基本组成,包括中央处理 器、内存、输入/输出设备等。
强制类型转换
通过类型转换运算符来实现,其一般 形式为“(类型说明符)(表达式) ”,其功能是把表达式的运算结果强 制转换成类型说明符所表示的类型。
03
控制结构
顺序结构
顺序结构的概念
按照代码的先后顺序,逐行 执行程序。
顺序结构的流程图
用箭头表示程序执行的顺序 。
顺序结构的应用场景
适用于简单的计算和输出任 务。
局部变量和全局变量
局部变量
在函数内部定义的变量,只在该函数内有效,不同函数中的局部变量互不影响。
全局变量
在函数外部定义的变量,可以在整个程序范围内访问,但过度使用全局变量会降低程序的可维护性和可读性。
模块化设计思想
模块化设计概念
01
将程序划分为若干个独立的功能模块,每个模块完成
特定的功能,提高程序的可维护性和可重用性。
&&、||、!等
运算符和表达式
位运算符
&、|、^、~、<<、>>等
赋值运算符
=、+=、-=、*=、/=等
条件运算符
?
运算符和表达式
逗号运算符
,
表达式
由运算符和操作数组成的式子,用于计算一个值
数据类型转换
自动类型转换
《初识C语言》课件
函数
C语言中的函数是执行特 定任务的代码块,可以
接受参数并返回值。
指针和内存管理
C语言使用指针来访问内 存地址,支持动态内存
分配和释放。
02
数据类型和运算符
BIG DATA EMPOWERS TO CREATE A NEW
ERA
数据类型
浮点型
用于存储小数,包括单精度和 双精度。例如:float, double。
ERA
C语言的起源和发展
起源
C语言由美国贝尔实验室的 Dennis Ritchie于1972年发明, 最初用于开发UNIX操作系统。
发展
随着时间的推移,C语言逐渐成为 计算机科学领域的基础语言,广 泛应用于操作系统、系统软件、 嵌入式系统等领域。
C语言的特点和应用领域
特点
C语言具有高效、灵活、可移植性强 的特点,能够直接操作内存,与硬件 交互能力强。
函数调用
在程序中调用函数时,需要提供函数名和参数列表,函数体将在调用时执行。
数组的定义和使用
一维数组
数组是一种存储相同类型数据的 数据结构。一维数组由一个下标 索引访问元素,数组元素在内存
中连续存储。
二维数组
二维数组由多个一维数组组成,可 以通过两个下标索引访问元素。二 维数组常用于表示矩阵或表at函数用于将两个字符串连 接起来,需要提供目标字符串和
要连接的字符串的地址。
05
指针和内存管理
BIG DATA EMPOWERS TO CREATE A NEW
ERA
指针的概念和定义
指针
指针是一种变量,它存储的是另一个变量的地址,而不是值。通过指针可以间接 访问所指向的变量。
指针的定义
c语言课件PPT课件
写入文件
使用fprintf函数将数据写入文件 中,按照指定的格式写入。
格式化输入输出
fscanf和fprintf函数支持格式化 输入输出,方便数据的读写。
文件的定位操作(fseek和ftell函数)
1 2
定位文件指针
使用fseek函数将文件指针移动到指定位置。
获取当前文件指针位置
使用ftell函数获取当前文件指针的位置。
先执行一次代码块,然后当条件满足时重复执行。
goto语句
无条件跳转到程序中的指定位置。
示例
使用do-while循环和goto语句实现一个简单的菜单选择系统。
04 函数和宏定义
函数的定义和调用
总结词
函数的定义和调用是C语言中非常重要的概念,它们允许我们将代码块组织在 一起,并在需要时多次调用它。
详细描述
VS
详细描述
宏定义使用`#define`指令来定义常量、 宏函数或条件编译指令。宏定义在预处理 阶段被替换为相应的值或代码块。文件包 含指令使用`#include`来包含其他文件的 内容,通常用于引入库的头文件或共享代 码。这些预处理指令可以帮助我们减少代 码重复和提高代码的可维护性。
05 数组和字符串
结合性是指相同优先级的运算符在表 达式中的结合方向,决定了运算符的 执行顺序。
03 控制结构
if语句和条件运算符
01
02
03
if语句
用于根据条件执行不同的 代码块。
条件运算符
也称为三目运算符,用于 简化if-else语句。
示例
判断一个数是否为正数、 负数或零。
switch语句和枚举类型
switch语句
字符串函数
C语言提供了一系列字符串函数,用于 对字符串进行操作,如连接、比较、 查找等。
C语言程序设计课件第06章数组、指针与字符串.ppt
17
指针数组
指 数组的元素是指针类型 针 例:Point *pa[2];
由pa[0],pa[1]两个指针组成
*i_pointer 3i
2000
9
指针变量的初始化
指 语法形式 存储类型 数据类型 *指针名=初始地址; 例:int a , *pa=&a;
针 注意事项
➢用变量地址作为初值时,该变量必须在指针初始化 之前已说明过,且变量类型应与指针类型一致。
➢可以用一个已赋初值的指针去初始化另一个指针变 量。
组 ➢ 数组下标从零开始。 ➢ 下标必须是整形表达式。 ➢ 数组元素可以在定义时直接给出初始值列表。 ➢ 数组元素作函数参数同简单变量作函数参数。 ➢ 数组名作函数参数传递的是地址值。 ➢ 二维数组在内存中按行存放。
4
对象数组
数 声明:
类名 数组名[元素个数];
组 访问方法:
数组名[下标].成员名
与!=的关系运算。
针
– 指向不同数据类型的指针,以及指针与一
般整数变量之间的关系运算是无意义的。
– 指针可以和零之间进行等于或不等于的关
系运算。例如:p==0或p!=0
16
指向数组元素的指针
指 声明与赋值
例:int a[10], *pa;
针 pa=&a[0]; 或 pa=a;
通过指针引用数组元素
C++语言程序设计
第六章 数组、指针与字符串
本章主要内容
数组 指针 动态存储分配 深拷贝与浅拷贝 字符串
大学C语言实用教程(课件)-第6章-指针
int *p=&a;
// p指向a
printf("a=%p b=%p c=%p p=%p\n",&a,&b,&c,&p); printf("p=%p *p=%d\n",p,*p);
p--;
}
// p指向a前面的存储单元
printf("p=%p *p=%d\n",p,*p);
2. 指针与整数相加减 指针加减一个整数n可以使指针移动,可以访问新地址。
char c= 'A',*pc=&c; float a=3.0,*pa=&a;
指针变量指向变量示意图
pa FF74 FF70 FF71 FF72 FF73 FF74 a 3.0 FF75 FF76 FF77 FF78 pc FF7C FF79 FF7A FF7B c A FF7C
② 赋值方法 先定义指针,然后用赋值语句将所指变量的地址赋给它。例如 char c,*pc;
4. 两个同类型指针相减
x[0]
如果两个同类型指针之间所存储的数据的 x[2] 类型也与指针相同(通常是数组的情况),则相 减的结果是这两个指针之间所包含的数据个数。 x[3]
x[4]
x[1]
【例】两个同类型指针相减。 #include <stdio.h> void main() { float x[10]; float *p,*q; p=&x[2]; q=&x[8]; printf("q-p=%d\n",q-p); }
6.1.2 指针和指针变量
1.指针和指针变量的概念
变量的指针:该变量在内存中的地址。 指针变量:专门用来存放变量地址的特殊变量。 在不致引起混淆的情况下,把指针变量简称为指针。
C语言6-指针
int a; int *p1; 指针p1 变量a
&a 目标变量p1
P1=&a;
&运算和*运算
&运算和*运算都属于单目运算,&要求运算量是变量或数
组元素,(取地址运算符)其形式为: & 变量名或数组元素名 其含义为取指定变量或数组元素的地址 *运算符要求运算量是地址,(指针运算符——间址运 算符)其形式为: *指针变量名或目标变量地址 含义为访问指定地址的目标变量 如: int i , j; int *p_1 , *p_2; p_1=&i; p_2=&j;
可见,指针p±n的运算并非内存地址含义上的运 算,而是C语言含义的地址运算。这种运算,一般 应在相同数据类型的存储区域上操作才有实际意 义,因此指针和数组关系密切,后图表示了这种 情况。
int a[40],*pa; pa-4 pa-3 pa-2 pa-1 pa pa+1 pa+2 pa+3 pa+4 a[ i –4] a[ i –3] a[ i –2] a[ i -1] a[ i ] a[i+1] a[i+2] a[i+3] a[i+4] (pa-4) (pa-3) (pa-2) (pa-1) pa (pa+1) (pa+2) (pa+3) (pa+4) 2004 2006 2008 2010 2012 2014 2016 2018 2020
运行情况如下: a=5,b=9 max=9,min=5
注: 程序中,a和b的值并未改变,但a1、a2的值已经改变, 因为程序始终让a1指向较小者,a2指向较大者,算法采取不 交换整型变量的值而交换指针变量的值的方法。 使用指针处理数据时,指针在使用前必须被赋予一定的地址 值或指定为空指针。一个没有赋值的指针其指向是不定的。 使用指针未定的指针接收数据时,常常会破坏内存中其它领 域的内容,甚至造成系统失控,应注意避免。例如下面对指 针p的使用是不恰当的:
《C语言》指针--ppt课件全文
说明: 这种方法可能会破坏系统的正常
工作状态,因为temp是一个指针变量 b 59
但是在函数中并没有给temp一个确定 的地址,这样它所指向的内存单元是 不可预见的,而对*temp的赋值可能 带来危害
swap2 &a p1
&b p2 随机值 temp
5?
ppt课件
11
例 6. 3 ③ #include <stdio.h> void swap3( int *p1, int *p2) { int *p;
p
*p = 12 ; printf (“%d\n” , *p ) ;
对a 重新赋值 等价于 a=12
2. & 与*
p =ห้องสมุดไป่ตู้&a ;
1010 152 a
&*p &(*p) &a *&a *(&a) *p a
ppt课件
6
3. *与 ++ , - -
int a = 2 , b = 5 , c , d , *p ; (1) p = &a ;
② 形参表列: 即指针变量所指向的函数的形参表列 ③ 格式中的小括号不能省略 2. 应用 (1) 让指针变量指向函数 pt = add ; 因为函数名为函数的入口地址, 所以直接将函数名 赋给指针变量即可 (2) 使用指针变量调用函数 格式 : (*指针变量名) ( 实参表列)
ppt课件
17
例 求一维数组中全部元素的和
因此我们可以定义一个指针变量, 让它的值等于 函数的入口地址, 然后可以通过这个指针变量来调用 函数, 该指针变量称为指向函数的指针变量
ppt课件
16
指向函数的指针变量
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一维数组元素输入和输出
方法二:首地址偏移法1 #include <stdio.h> void main( ) { int a[10],i; for ( i=0; i<10; i++) scanf("%d", a+i); printf("\n"); for ( i=0; i<10; i++) printf("%5d", *(a+i)); printf("\n"); } 首地址偏移法2 #include <stdio.h> void main( ) { int a[10],*p=a,i; for ( i=0; i<10; i++) scanf("%d", p+i); printf("\n"); for ( i=0; i<10; i++) printf("%5d", *(p+i)); printf("\n"); } 20
a+i, &a[i] 或 int a[10], *p=a; 或 int a[10], *p=a; 或 int a[10], *p=&a[0]; 或 int a[10], *p=&a[0]; p+i,&p[i]
a[i],*(a+i) p[i],*(p+i) *(p+i) *(p+i) 与p[i] 与p[i] 等价 等价 16
a a+1 a+2 a+3 a+4 a+5 a+6 a+7 a+8 a+9
a[i]与 a[i]与 *(a+i) *(a+i) 等价 等价
15
三、指向一维数组元素的指针变量
指向数组元素的指针变量的定义: 类型名 * 指针变量名 a,&a[0]
例: int a[10]; int *p; p=a; 或p=&a[0]; p a[0],*a p[0],*p
4
指针的意义
– C程序设计中使用指针可以:
有效地表示复杂的数据结构 动态分配内存 方便地使用数组和字符串 得到多于一个的函数返回值
– 使用指针,可以使程序更加简洁、紧凑、高效
指针是C的精髓 , 没掌握指针就等于没掌握C语言。
5
6.1.2+6.1.4 指针变量的定义及赋值
指针变量的定义: 类型名 *指针变量名; 定义指针所指向的数据 类型,也叫“基类型名”
a是对变量 的直接访问
注意:定义指针变量时的“*”与其它位置出现的“*”含义不同 前者表示p是指针变量 后者表示对指针变量所指单元进行间接访问 9
例 通过指针变量实现两个数的交换(1)
例6.3 a b pa pb pc
#include <stdio.h> void main( ) {int a=10,b=50; int *pa,*pb,*pc; pa=&a;pb=&b; pc=pa;pa=pb;pb=pc; printf("a=%d,b=%d\n",a,b );
a
&a C程序不关心变量的地址具体值, 需要地址时,用 &i 取地址
8
2.间接访问运算符 * 用法:*指针变量名 功能:对指针变量所指单元间接访问,即引用 指针变量所指单元的值 单目运算符,“右”结合性,优先级2
*p是对变量a 的间接访问 举例:如果有定义 int a,b,*p; p=&a; *p=78; 等价于 a=78 ; b=*p+4; 等价于 b=a+4 ;
举例:用指针方法实现数组N个元素的冒泡排序(升序)
核心程序段: 用下标法表示数据元素 int a[N],i,j,temp,swap; …… for(i=N-1;i>=1;i--)
/* i 为各目标位置的下标 */
用指针方法表示数据元素 int a[N],*p,*q,temp; …… for(p=a+N-1;p>a;p--)
移p到下一单元,后者先移p到下一单元再访问)
(*p)++与*(p++)不等价 (前者是被访问单元值加1,
后者是指针值加1) 18
一维数组元素遍历
------以一维数组元素输入和输出为例 方法一:下标法1 #include <stdio.h> void main( ) { int a[10],i; for ( i=0; i<10; i++) scanf("%d", &a[i]); printf("\n"); for ( i=0; i<10; i++) printf("%5d", a[i]); printf("\n"); } 下标法2 指针p当作 数组名使用 #include <stdio.h> void main( ) { int a[10],*p=a,i; for ( i=0; i<10; i++) scanf("%d", &p[i]); printf("\n"); for ( i=0; i<10; i++) printf("%5d", p[i]); printf("\n"); } 19
冒泡排序法的改进算法
若在某趟每一对相邻元素均无需交换,说明数列已 是有序的了,则可以提前结束排序工作。 第1趟,目标a[4] a[0] a[1] a[2] a[3] a[4] 4 9 6 7 8 4 6 9 7 8 4 6 7 9 8 第2趟,目标a[3] 4 6 7 8 9 本例只需2趟 4 6 7 8 9
指针变量p指向数组a后, 指针变量p指向数组a后, p可以当作数组名a使用 p可以当作数组名a使用
6.2.2 指针变量的运算
间接访问运算 *p:
int a [ 10 ];
取p所指单元的值
加减运算 p±i: 指向与p偏移i个单位的元素 自增自减运算 p++/p--: p移向下/上一个元素 指针相减运算 p2-p: 计算p2与p相隔的元素个数 指针比较运算 p2>p: 地址值大小比较
变量 i
注意:变量的地址不同于变量名 变量名 地址 i 变量 值
2
2000 100 可用&i 获取
地址2000“指向”变量 i
指针变量:用来存放地址的变量。
将地址2000存放在变量i_pointer中 i_pointer称为“指针变量” i_pointer i 2000 100
2000是“变量的地址” 2000指向i i_pointer指向i
如:int *p ;
“*”表示所定义的 变量为指针型变量
定义 p 为指向整型(基类型为整型)的指针变量, 即 p 中可以存放一个整型数据的地址。 6
指针变量的赋值 指针变量名=变量地址; p 如 int a,*p; &a p=&a ;
a
目的:将指针变量指向一个存储单元 指针变量的初始化: 类型名 *指针变量名=变量地址; 如 int a , *p=&a ;
/* p逐一指向各目标位置*/
for(j=0;j<=i-1;j++) if (a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; }
for(q=a;q<=p-1;q++) if (*q>*(q+1) ) { temp=*q; *q=*(q+1); *(q+1)=temp; } 23
50 10 10 50 2000 3000 10
2000 3000
该程序交换的是两个指针变量所指单元的值, 该程序交换的是两个指针变量所指单元的值, 即变量a和b的值。 即变量a和b的值。
11
指针变量与普通变量的对比
共性 – 在内存中占据一定大小的存储单元 – 先定义,后使用 – 类型定义后不能改变(普通变量只能存放所 定义类型的数据,指针变量只能指向所定义 类型的存储单元 特殊性 – 指针变量的内容只能是地址,而不能是数据 – 指针变量只有赋值后才有明确的指向。 注意:若指针变量无明确指向,访问它所指 单元是无意义的,甚至可能造成严重后果!
例6.3
#include <stdio.h> void main( ) {int a,b,temp; /*非int*temp;*/ int *pa,*pb; pa=&a;pb=&b; temp=*pa;*pa=*pb;*pb=temp; printf("a=%d,b=%d\n", a,b ); }
a b pa pb temp
3
指针的概念
两种观点: 1、指针是指针变量的简称。 C语言之父丹尼斯·里奇:A poinFra biblioteker is a
variable that contains the address of a variable.
2、指针是地址的形象化称谓。 我国著名的C语言教材编写者谭浩强:变量的地 址称为该变量的“指针”。
一维数组元素输入和输出
方法三:指针移动法 #include <stdio.h> void main( ) { int a[10],*p=a; a为常量, 不能用a++
for ( ; p<a+10; p++) scanf("%d", p); printf("\n"); for ( p=a; p<a+10; p++) printf("%5d",*p); }