c程序设计第八章 指针[1]教学课件
合集下载
指针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语言程序设计》第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)
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章

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

二维数组的地址
【例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语言程序设计--第八章

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语言程序设计
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语言的应用领域
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
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函数分配的内存空间,防 止内存泄漏。
动态规划思想
动态规划是一种在数学、计算机科学和经济学中 使用的,通过把原问题分解为相对简单的子问题 的方式来求解复杂问题的方法。动态规划常用于 优化重叠子问题的计算。
回溯与分支限界法
回溯法是一种通过探索所有可能的候选解来找出 所有解的算法,而分支限界法是一种通过剪枝来 减少搜索空间的优化算法。回溯与分支限界法常 用于解决组合优化问题。
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
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函数分配的内存空间,防 止内存泄漏。
动态规划思想
动态规划是一种在数学、计算机科学和经济学中 使用的,通过把原问题分解为相对简单的子问题 的方式来求解复杂问题的方法。动态规划常用于 优化重叠子问题的计算。
回溯与分支限界法
回溯法是一种通过探索所有可能的候选解来找出 所有解的算法,而分支限界法是一种通过剪枝来 减少搜索空间的优化算法。回溯与分支限界法常 用于解决组合优化问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; ; 其他指针变量