c程序设计第八章 指针[1]教学课件

合集下载

指针ppt课件

指针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

《C语言程序设计》第8章指针

《C语言程序设计》第8章指针
}
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)

精品课件-C程序设计(第三版)(荣政)-第8章

精品课件-C程序设计(第三版)(荣政)-第8章

第八章 指针
指针类型是对所有类型的指针的总称,指针的类型是指 针所指对象的数据类型。例如,pc是指向字符变量的指针, 简称字符指针。字符指针是基本类型的指针之一,除各种基 本类型之外,允许说明指向数组的指针、指向函数的指针、 指向结构体和共用体的指针以及指向各类指针的指针。在C 语言中只有指针被允许用来存放地址的值,其它类型的变量 只能存放该类型的数据。(很多书中用指针一词来指地址值, 或用指针变量来代表指针,阅读中应注意其具体含义。)
例8.2中指向整型的指针point在定义之后直接使用了,这 两条语句在编译时不会出现语法错误,但在使用时却几乎肯定 会出问题。表面上看,scanf()函数的参数要求给出的是地址, 而point的值就代表的是地址,但是point的值究竟是多少,也 就是说point究竟指向哪里,我们无法得知,在这种情况下就 对point指向的单元进行输入操作,将冲掉point指向的单元的 原有内容,假如这个单元是操作系统的所在处,就破坏了操作 系统,显然是一件危险的事。
为了理解指针的概念,程序员要有关于计算机如何在存储 器中存储信息的基本知识。以下简单地介绍个人计算机中存储 器存储的情况。
第八章 指针
个人计算机中CPU可以直接访问的,用来存储程序和数据 的记忆部件称为内存储器,内存储器由成千上万个顺序存储单 元组成,每个单元由一个惟一的地址标识。给定计算机的存储 器地址范围为从0到所安装的存储器数量的最大值。在计算机 上运行的每一个程序都要使用存储器。例如,操作系统要占用 一些计算机存储空间,每个应用程序也要占用计算机存储空间。 按照面向过程的结构化程序设计方法,程序代码和程序要处理 的数据是分开存储的,所以,一个程序在内存中要占两部分空 间:数据部分和指令代码部分。
第八章 指针

C语言程序设计知识点—第8章 指针结构体与预处理命令

C语言程序设计知识点—第8章 指针结构体与预处理命令
比较两个指针 #include<stdio.h> void main () { int *ptrnum1, *ptrnum2; int value = 1; ptrnum1 = &value; value += 10; ptrnum2 = &value; if (ptrnum1 == ptrnum2) printf("\n 两个指针指向同一个地址\n"); else printf("\n 两个指针指向不同的地址\n"); }
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。

C语言程序设计第8单元

C语言程序设计第8单元

二维数组的地址
【例8.9】使用指针变量输出二维数组元素 #include<stdio.h> main() { int a[2][3]={{1,2,3},{4,5,6}},*p;
for(p=a[0];p<a[0]+6;p++) { if((p-a[0])%3==0)printf("\n");
printf("%2d",*p); } }
0x62fe3a
0x62fe3b
0x62fe3c
数组指针的运算
对于指针变量p,可以做以下运算: p++,p--,p+i, p-i, p+=i, p-= i等。
#include <stdio.h> main() { int a[]={1,3,6,7,9,12};
int x,*p=&a[2]; x=(*--p)++; printf("x=%d\n",x); printf("a[1]=%d\n",a[1]); }
0x62fe50
二维数组的地址
#include <stdio.h>
main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,a1是1,1行2指}};针
printf("%x,%x,%x\n",a,a+1,a+2); printf("%x,%x,%x\n",*a,*(a+1),*(a+2)); *a是列指针
二维数组的地址
二维数组名是数组的首地址,二维数组名的基类型不是数组元素类 型,而是一维数组类型,因此,二维数组名a是一个行指针。

高树芳C语言程序设计--第八章

高树芳C语言程序设计--第八章

30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数

C语言程序设计第八章 优化学生成绩分析系统指针.ppt

C语言程序设计第八章 优化学生成绩分析系统指针.ppt

C语言程序设计
1 指针与字符串(5)
1.2 使用字符串指针变量与字符数组的区别(续) 例2 分析下面程序的运行结果
main() { char *a="I Love China!";
a=a+7; printf(“%s\n",a); }
运行结果: China!
9
项目八 优化学生成绩分析系统-指针
C语言程序设计
int a,b,c;
例sc6an将f(给"%出d的,%程d"序,&修a,改&b为);使用函数指针变量定义
的c=方m式ax(a,b);
c=(*p)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
指针数组,有4个元素,每个元素 都是指向整型变量指针变量
Int (*p)[4];
由4个整型变量组成的数组的指针
21
项目八 优化学生成绩分析系统-指针
#include <stdio.h> ma3in指()针数组 (2)
C语言程序设计
p[0]
11
{ 3.1 指针数组(续)
22
static int
33
a[3][4]={{11,22,33,44},{55,66,77,88},{99,110,1224,4133}};
【项目分析】
为了保存一个班的C语言成绩需要借助于一维数组,通过指针对其数 据进行操作。将本项目分成两部分,首先借助于指针对一维数组进 行访问,然后介绍一种新的排序算法—选择排序。

C语言程序设计教程ppt课件完整版pptx

C语言程序设计教程ppt课件完整版pptx
C语言的应用领域
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
01
常见的C语言编程环境
02
安装与配置C语言编译器
使用集成开发环境(IDE)进行C语言编程
03
第一个C程序:Hello, World!
01
C程序的基本结 构
02
编写Hello, World!程序
应用场景
适用于需要根据特定条件提前终 止循环或跳过某些循环操作的情 况。
04 函数与模块化设计
函数定义和调用
01
函数定义
包括函数名、参数列表、返回值 类型和函数体等部分,用于描述 函数的功能和实现细节。
函数调用
02
03
函数声明
通过函数名和参数列表来调用函 数,实现相应功能并获取返回值 。
在使用函数之前,需要对函数进 行声明,以便编译器识别函数的 存在和调用方式。
THANKS FOR WATCHING
感谢您的观看
指针运算符
包括取地址运算符&和取值运算符*,分别 用于获取变量的内存地址和通过指针访问内 存中的数据。
动态内存分配函数(malloc, free)使用方法
malloc函数
用于在堆区动态分配指定大小的内存空间,并返回 分配内存的起始地址。
free函数
用于释放之前通过malloc函数分配的内存空间,防 止内存泄漏。
动态规划思想
动态规划是一种在数学、计算机科学和经济学中 使用的,通过把原问题分解为相对简单的子问题 的方式来求解复杂问题的方法。动态规划常用于 优化重叠子问题的计算。
回溯与分支限界法
回溯法是一种通过探索所有可能的候选解来找出 所有解的算法,而分支限界法是一种通过剪枝来 减少搜索空间的优化算法。回溯与分支限界法常 用于解决组合优化问题。

C程序设计教程课件PPT课件

C程序设计教程课件PPT课件

哈希查找
通过哈希函数将元素的关键字转 换为数组的索引,然后在对应位 置进行查找。时间复杂度为O(1)。
THANKS
感谢观看
选择排序
每次从未排序序列中选出最小 (或最大)元素,放到已排序
序列的末尾。时间复杂度为 O(n^2)。
插入排序
将未排序元素插入到已排序序 列中的适当位置,以达到排序 的目的。时间复杂度为O(n^2)。
常见排序算法实现原理及性能比较
快速排序
采用分治策略,通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比另一部分的 所有元素小,然后再对这两部分继续进行排序。时间复杂度为O(nlogn)。
示例1
使用fprintf()和fscanf()函数实现 文件的读写操作。
示例2
使用fgetc()和fputc()函数实现文 件的字符读写操作。
示例3
使用fgets()和fputs()函数实现文 件的字符串读写操作。
示例4
使用fread()和fwrite()函数实现 文件的数据块读写操作。
数据存储格式选择(如:文本、二进制)
01
文本格式
02
二进制格式
03
选择依据
将数据以字符形式存储,便于查看和编 辑,但占用空间较大。
将数据以二进制形式存储,占用空间较 小,读写效率高,但不便于直接查看和 编辑。
根据实际需求选择数据存储格式,如需 要频繁读写大量数据且对存储空间有要 求时,可以选择二进制格式;如需要方 便查看和编辑数据时,可以选择文本格 式。
算法概念及评价标准
算法概念
为解决特定问题而规定的一系列操作步骤,具有有穷性、确定性、可行性、输 入和输出五个基本特性。
评价标准

指针ppt课件

指针ppt课件

可以通过将数组名赋值给指针变量来 初始化数组指针,例如 int *p = arr; 其中 arr 是数组名。
指向数组的指针
指向数组的指针的概念
指向数组的指针是指向整个数组的指针,可以通过将数组 名赋值给指针变量来获取整个数组的首地址。
指向数组的指针的初始化
可以通过将整个数组名赋值给指针变量来初始化指向数组 的指针,例如 int (*p)[5] = &arr; 其中 arr 是包含 5 个整 数的数组。
指针乘法和除法
指针的乘法和除法运算在实际编程中很少使用,因为它们的意义不太 明确。
指针的关系运算
01
关系运算符
包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等
。这些运算符可以用于比较两个指针所指向的内存地址的大小关系。
02
大于和小于运算
比较两个指针所指向的内存地址的大小,如果第一个地址大于第二个地
06 指针的高级应用
动态内存分配
动态内存分配的概念
动态内存分配是指在程序运行时,根据需要动态地分配或释放内 存空间的过程。
动态内存分配的方法
常见的动态内存分配方法有malloc、calloc、realloc和free等函数 。
动态内存分配的注意事项
在动态内存分配时,需要注意内存对齐、内存碎片化、内存泄漏等 问题,以确保程序的正确性和稳定性。
二叉树操作
二叉树的概念
二叉树是一种树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点 。
二叉树的创建与遍历
二叉树的创建需要为每个节点分配内存,并设置左子节点和右子节点的指针;二叉树的遍 历包括前序遍历、中序遍历和后序遍历等,需要遵循二叉树的结构和特性进行操作。

全的C语言指针详解PPT课件

全的C语言指针详解PPT课件
2. 应用 (1) 让指针变量指向函数 pt = add ;
因为函数名为函数的入口地址, 所以直接将函数名 赋给指针变量即可 (2) 使用指针变量调用函数 格式 : (*指针变量名) ( 实参表列)
第16页/共47页
定义指向函数 的指针变量
通过pt 调用 函数add
例 求一维数组中全部元素的和
#include <stdio.h>
② 间接访问 : 将一个变量的地址存放在另一个变量中.
如将变量 x 的地址存放在 变量p 中, 访问x 时先找到p,
2012
再由p 中存放的地址找到 x
1010
p
(2) 指针: 一个变量的指针就是该变量的地址(指针就是地址) (3) 指针变量: 存放变量地址的变量, 它用来指向另一个变量
1010 x
{ p = p1 ;
p1 = p2 ; p2 = p ;
p &a
}
printf(“a=%d, b=%d \n”, a , b);
printf(“max=%d, min=%d \n”,*p1 ,*p2) ;
}
5a 9b
输出结果: a=5 , b=9 max=9 , min=5
第7页/共47页
6.2 指针与函数
else return(NULL); }
void main( ) { char *p1,*p2 ; int i ;
p1=alloc(10); strcpy(p1,”123456789”); p2=alloc(5); strcpy(p2,”abcd”); printf(“buf=%p\n”, buf); printf(“p1=%p\n”, p1); printf(“p2=%p\n”, p2); puts(p1); puts(p2); for( i=0 ; i<15 ; i++)

四川大学《c语言程序设计》课件-第8章 结构体与共用体

四川大学《c语言程序设计》课件-第8章 结构体与共用体
男 1999
90 83 72 82
2 林平之
男 1999
78 92 88 78
3 岳灵珊
女 1999
89 72 98 66
4 任盈盈
女 1999
78 95 87 90
结构体的解决方法
struct STUDENT
{ int studentID;
/*每个学生的序号*/
char studentName[10];/*每个学生的姓名*/
};
结构体变量的指针
struct STUDENT
{
int
studentID;
char
studentName[10];
char
studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
int
scoreMath;
int
结构体的内存占用
double 占用内存字节数 = 8 struct 类型用内存字节数 = ? 是所有成员变量的内存总和吗?
用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型)
struct number
{ short i; char ch;
float f;
};
printf("%d\n", sizeof(struct number));
struct STUDENT *pStu; /*定义结构体指针*/
pStu = &stu;
通过stu和成员运算符访问结构体成员
– stu. studentID = 1;
通过pStu和指向运算符访问结构体成员

C语言程序设计教程第8章北京邮电大学出版社.

C语言程序设计教程第8章北京邮电大学出版社.

第8章 指针
18
说明: 对于不同基类型的指针,指针变量“加上” 或“减去”一个整数n所移动的字节数(= sizeof( 指针所指对象的数据类型 ) )是不同的。 例如: float a[10], *p=a, *x; x=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第三个分量*/
C语言程序设计教程
第 8 章 指针
8.1 8.2 8.3 8.4 8.5 8.6 指针与指针变量 指针与函数 指针与数组 指针与字符串 指针数组与命令行参数 程序举例
第8章 指针
2
8.1 指针与指针变量
8.1.1 指针的概念
1.内存与变量地址 内存地址:内存是计算机用于存储数据的存储 器,以一个字节作为存储单元,为了便于访问,给 每个字节单元一个唯一的编号,第一字节单元编号 为0,以后各单元按顺序连续编号,这些单元编号 称为内存单元的地址 。 变量地址:变量所分配存储空间的首字节单元 地址(字节单元编号)。
2018/9/14
C语言程序设计教程
第8章 指针
3
在程序中,对变量的操作实际上是通过地址来完成的。 • 定义时:定义变量→分配内存单元(按类型)→地址 (即内存中的编号) • 存取操作:程序 →变量名 →内存单元 →存取 • 实际上: 程序 →编译 →变量名 →变量的地址
2.访问方式
直接存取:把直接按变量名或地址存取变量值的方式 称为 “直接存取”方式。
2018/9/14
C语言程序设计教程
第8章 指针
10
8.1.3 指针运算
指针运算实际上是地址的计算,包括赋值运算、算术运算、 关系运算三种。
1. 指针的赋值运算 (1)将变量地址值赋给指针变量,使指针指向该变 量。

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针
}
8.5.3 指针与二维数组
• 二维数组其实可以看成由一维数组构造而成。就相当于 几个队列构成一个方阵,方阵由队列组成,队列由具体 的元素--人组成。
• 一级指针只能管理队列,如果管理方阵,则需要二级指 针。
•int a=1000,*pa,**ppa; • pa=&a; • ppa=&pa;
• *(*(ppa)) ≡ *(pa) ≡ a ≡ 1000
• p是二级指针 • *p相当于*(p+0),级别降低为一级指针,相当于p[0] • **p相当于*(*(p+0)+0),级别降低为数组元素(普通变量),
也相当于p[0][0]
• p[1][2],相当于*(*(p+1)+2) • &p[1][2], 级别提升为一级指针,相当于:
• p[1]+2,*(p+1)+2 • &p[1],级别提升为二级指针,相当于:
f=f4; printf("a/b=%d\n",f(a,b));
8.5 指针与数组
• 8.5.1 指针与字符数组 • char str[100]= "Hello World"; • char *p=str; • 字符w可以有如下多种表示形式: • str[6] • *(str+6) • p[6] • *(p+6)
【例8-2】演示指针和数组的关系。
#include <stdio.h>
接可存取,由于p中存储的是x的信息。访问p可以获取x的信 息,再对银行存款进行操作。
8.1 借钱的故事
8.2 指针的概念
• C语言允许使用变量名、数组名[下标]、函数名等标 识符来访问内存

C语言程序设计第八章 指针的使用

C语言程序设计第八章 指针的使用

第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。

学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。

(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。

(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。

(4)了解指针与字符串的关系,能熟练使用指针处理字符串。

(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。

(6)指向指针的指针的运用。

【学习导航】本章的在整个课程中的位置如图5-1所示。

图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。

指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。

有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。

8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。

既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。

指针变量和其他类型的变量的区别是:指针变量存储的是地址。

所以要学好指针,就一定要明白数据在内存中是如何存储的。

计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。

地址就是内存区中对每个字节的编号。

下面通过两个整型变量来说明。

整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。

把变量所占用的存储单元首字节的地址作为变量的地址。

C语言中利用取地址运算符“&”获取变量的存储地址。

例如,&c将返回c的首地址;&x将返回x的首地址。

2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。

67全国计算机等级考试实用应试教程二级C语言 第8章 指针PPT课件

67全国计算机等级考试实用应试教程二级C语言 第8章  指针PPT课件
9
(2)通过指针变量获得地址值 可以通过赋值运算,把一个指针变量中的地址
值赋给另一个指针变量,从而使这两个指针变量 指向同一地址。例如,若有以上定义,则语句:
p=q; 使指针变量p中也存放了变量k的地址,也就是 说指针变量p和q都指向了变量k。 注意:在赋值号两边指针变量的基类型必须相同。 (3)通过标准函数获得地址值 可以通过调用库函数malloc和calloc在内存中开 辟动态存储单元,并把所开辟的动态存储单元的 地址赋给指针变量。
10
8.3.2 给指针变量赋“空”值 除了给指针变量赋地址值外,还可以给指针变
量赋NULL值。 例如:p=NULL; NULL是在stdio.h头文件中的预定义符。NULL
的代码值为0,当p=NULL时,称p为空指针。因 为NULL的代码值是0,所以上面语句等价于:
p=’\0’; 或 p=0; 这时,指针p并不是指向地址为0的存储单元, 而是具有一个确定的值——“空”。企图通过一个 空指针去访问一个存储单元时,将会得到一个出 错信息。
(2)*&a的含义是a。因为先进行&a运算,得到a的 地址,再进行*运算,即&a所向的变量,因此*&a 等价于a。
(3)(*p)++相当于a++。注意括号是必要的,如果 没有括号,就成为*(p++),这时使指针变量本身 增1,并不是使p所指的存储单元的值增1。
13
2.通过指针引用存储单元 例如: int *p, k=4, q; p=&i; 则赋值语句 q=*p; 就是把p所指存储单元(k)的内容(整数4)赋 予变量q,这里的*p代表p所指向的变量i。因此, 上面的语句等价于 q=k;
2

C语言课件(精华版)

C语言课件(精华版)

循环结构
(1) 当型 (while 型循环 ) 当条件成立, 执行循环体, 否则跳出循环体。
条件
F
T
语句块
条件 语句块
L形框——用于表示循环结构
(2) 直到型循环 (do-while型循环 )
首先执行循环体, 若条件不成立继续执行循环体, 直到条件成立为止。
语句块
条件 F T
语句块 条件
【例1.2】在屏幕上显示一行文字“Welcome to C!”。
//声明部分, 定义变量类型
② 赋初值 ③ 计算 ④ 输出
a=123; b=456;
//执行部分, 赋值语句
sum=a+b;
//执行部分, 赋值语句
printf(“sum=%d\n”, sum); //执行部分,输出语句 }
程序运行结果:
sum=579
【例1.4】求两个数中的较大值
程序由两个函数组成: − main 函数和max 函数。
面向过程的程序设计
所谓面向过程的程序设计, 是指利用面向过程的语言工具 (如Pascal、Fortran和C语言等)进行程序开发的各项活动。
基本思想:
把一个需要求解的复杂问题分为 若干个模块来处理,每个模块处 理一个子问题;设计时遵循自顶 向下、逐步细化、模块化设计和 结构化编码的原则。
优点:编程简单、结构性强、可读性好;
读入x, y, z
T
x>y
F
maxx maxy
z>max
T
F
maxz
打印max单元的值
结构化程序设计
C语言是结构化程序设计语言, 有三种基本结构。 顺序结构 选择结构 循环结构 程实序践设证计明的,目任标何在复正杂确的的算前法提都下可, 以其用重这要三性种排基列本次 序结依构次来为描: 述可。读、可维护、可移植和高效。
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(2) 指针加 和减 运算 指针加1和减 和减1运算
指针的加1和减 运算 指针的加 和减1运算,只是指针与整 和减 运算, 数的加减运算的特例,例如: 数的加减运算的特例,例如: int *pn,n,m; , , ; pn = &n; ; m = *pn++; //先赋值再自加 ; 先赋值再自加
(3) 指针相减运算
同类型的指针变量p1和 相减 相减, 同类型的指针变量 和p2字节数。 例如: 例如: Type *p1, *p2 那么有: 那么有:p2-p1=(p2-p1)/sizeof(Type)
【例】使用指针将两个整数交换顺序 #include "stdio.h" 在引入指针运 main() 算后, 算后,数据交 { int m,n,*pm,*pn,temp; 换可通过指针 pm=&m; pn=&n; 所指向的存储 scanf("%d%d",&m,&n); 地址进行操作 temp=*pm; m和n的值改 *pm=*pn; 变了吗? 变了吗? *pn=temp; printf("%d,%d\n",m,n); printf("%d,%d\ printf("%d,%d\ printf("%d,%d\n",*pm,*pn); }
a[0]:第0行第 列元素的地址 即&a[0][0] 第 行第 列元素的地址,即 行第0列元素的地址 a[1]:第1行第零列元素的地址 即&a[1][0] 行第零列元素的地址,即 第 行第零列元素的地址 a[2]:第2行第零列元素的地址 即&a[2][0] 行第零列元素的地址,即 第 行第零列元素的地址 a[0]+1:第0行第 列地址是 行第1列地址是 第 行第 列地址是&a[0][1] a[1]+2:第1行第 列地址是 行第2列地址是 第 行第 列地址是&a[1][2] a[1]+2=> *(a+1)+2=> &a[1][2] ----不能写成 不能写成*(a+1+2) 不能写成
a[0]+1
a[0][1] a[1][1] a[2][1] a[0][2] a[0][3] a[1][2] a[1][3] a[2][2] a[2][3]
a
a+1 a+2
第零行首地址, 第零行首地址,即数组的首地址 第一行首地址, 第一行首地址,即a[1]首地址 首地址 第二行首地址, 第二行首地址,即a[2]的首地址 的首地址
8.2.2 指向多维数组的指针
(1)二维数组的指针 假设有如下数组: 二维数组的指针 假设有如下数组:
int a[3][4]={{1,3,5,7},{9,11,13,15}{17,19,21,23}}
a
(2000) a+1 (2008) a+2 (2016)
a[0][0] a[1][0] a[2][0]
第8章 指针及其应用
本章主要内容
指针的定义和引用 指针与数组 字符指针和字符串
8.1 指针与指针变量
8.1.1指针的基本概念 指针的基本概念
就像同 学与所 住宿舍 号码的 关系
8.1.2 指针的定义
指针定义的一般形式为: 指针定义的一般形式为: 指针名1[,*指针名 指针名2,…]; 类型标识符 *指针名 指针名 指针名
二维数组做函数参数) 例:求成绩的平均值 (二维数组做函数参数 二维数组做函数参数 #include “stdio.h” void average(float *p,int n) {float *p_end=p+n-1,sum=0, aver; for(;p<=p_end;p++) sum=sum+(*p); aver=sum/n; printf("average=%5.2f\n",aver);} main() {static float score[3][4]={{60,61,62,63}, {70,71,72,73},{80,81,82,83}}; average(score,12);}
8.2 指针与数组
数组名是数组在内存中的 首地址, 首地址,且数组的元素在内存 中占用连续的一片存储空间, 中占用连续的一片存储空间, 因此, 因此,可用指针访问数组元素
8.2.1 指向一维数组的指针
float x[10],*px;//定义数组和指针 , ; 定义数组和指针 px=x; 或px=&x[0]; //指针指向数组 //指针指向数组 访问数组元素方法: 访问数组元素方法: •偏移量法,如:*(px+2) //px值不变 偏移量法, 偏移量法 值不变 •指针移动法,如:px++ //px值变化 指针移动法, 指针移动法 值变化 •x++是不允许的,因为数组名是常量 x++是不允许的 x++是不允许的, *px就是x[0],*(px+i)就是x[i]。 *px就是x[0],*(px+i)就是x[i]。 就是x[0],*(px+i)就是x[i] x[i],*(px+i),*(x+i)都是等效的 x[i],*(px+i),*(x+i)都是等效的
8.1.4 指针运算符 “*” 指针运算符,表示“指向” 指针运算符,表示“指向” “&” 地址运算符 int n, *i_point; ; i_ point= &n; ; &(* i_ point)等效于 point 等效于i_ 等效于 *(&n)等效于 等效于n 等效于
应区分i_ 三者的区别: 应区分 point 、* i_ point 和& i_ point三者的区别: 三者的区别 i_ point:是指针变量,其内容是地址量 :是指针变量, • * i_ point:是指针变量的目标变量 : • & i_ point:是指针变量本身所占据的存储地址 :
定义: 定义: 例:int i; int *i_pointer; 引用: 引用: i=3 *i_pointer=3 &i_pointer=3010 i_pointer=2000
内存用户数据区
2000 2002
3 6
变量 i 变量 j 变量 i_pointer
3010
2000
i_pointer 2000
指向由m个元素组成的一维数组的 指向由 个元素组成的一维数组的 指针变量 例:static int a[4]={1,2,3,4}; int (*p)[4],i,j; p=a; int(*p)[4]表明 是一个指针变量, 表明p是一个指针变量 表明 是一个指针变量, 它指向包含4个元素的一维数组 个元素的一维数组, 它指向包含 个元素的一维数组, 若写成*p[4],则表明是指针数组 若写成 , 以后再讲) (以后再讲)
8.3 字符指针和字符串
两种 初始 化的 方法 在定义的同时进行初始化 例如: 例如:char *p =”a string”; ; 末尾自 动加 ‘\0’, , 标志结 束,不 计入总 长度
利用赋值语句初始化 char *s; ; s = “string”; ;
【例】使用指针编写程序,比较两个 使用指针编写程序, 字符串的大小(不使用字符串处理函数 不使用字符串处理函数) 字符串的大小 不使用字符串处理函数 步骤: 步骤: •定义两个指向字符串的指针 定义两个指向字符串的指针 •通过移动指针进行逐字符比较 通过移动指针进行逐字符比较 如有字符串ABCdEF和ABCDEF, 和 如有字符串 , 则认为ABCdEF比ABCDEF大 则认为 比 大 原因: 个字符一样, 个字符d的 原因:前3个字符一样,第4个字符 的 个字符一样 个字符 ASCII值比 的ASCII值大 值比D的 值比 值大
不能是普通整数。 不能是普通整数。 但赋0 但赋0值,表示空指针
算术
与整数的加减运算、 和 与整数的加减运算、加1和 运算、 减1运算、指针相减运算 运算
(1) 指针与整数的加、减运算 指针与整数的加、
指针point加上或减去一个整数 加上或减去一个整数 指针 n,将相对于当前位置前移或后移 ,将相对于当前位置前移或后移n 个存储单元。 个存储单元。 int * pn; ; 不妨设pn=0x0000,那么 不妨设 , pn+n=pn+n*sizeof(int)=0x0000+n*2
个数, 例:输入3个数,由大到小排序输出 输入 个数 main () { int a,b,c,*pa,*pb,*pc; scanf("%d,%d,%d",&a,&b,&c); exchange(int *q1,int *q2,int *q3) pa=&a; { if(*q1<*q2) swap(q1,q2); if(*q1<*q3) swap(q1,q3); pb=&b; if(*q2<*q3) swap(q2,q3); } pc=&c; exchange(pa,pb,pc); printf("%d,%d,%d\n",a,b,c); printf("%d,%d,%d\n", swap(int *a,int *b) {int p; *pa,*pb,*pc); } p=*a;*a=*b;*b=p;}
数据具有不同的类 型,定义指针时也 要定义该指针所指 向的数据类型
int *pn; char *pch; float *pf;
8.1.3 指针的初始化
指针是一种变量, 指针是一种变量,在定义的同时可 以赋给它初始值,称为指针的初始化。 以赋给它初始值,称为指针的初始化。 形式如下: 形式如下: 指针名=初始地址值 类型标识符 *指针名 初始地址值; 指针名 初始地址值; 例如, 例如, 变量地址作初值时, 变量地址作初值时, int m,n[8]; , ; 该变量在此之前已 char c; 说明过, 说明过,且类型应 int *pm = &m; ; 一致。 一致。可用已赋初 int *pn = n; ; 值的指针去初始化 char *pc = &c; ; 其他指针变量
相关文档
最新文档