C程序设计12-指针综述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2015/12/23 11
12.3.2 指向数组的指针变量
指向一维数组的指针变量的适用场合
常用来作函数的形参
例:已知3人4门课的成绩,由被调函数求总平均
float average(int (*p)[4]) //参数传递后,p指向a[0] { float sum=0; int i; for(i=0;i<=11;i++) sum+=*(*p+i); //*p即a[0],指向a[0][0] return sum/12; } int main() { int a[3][4]={67,86,90,77,92,88,79,80,65,30,78,66}; printf(“%.2f\n”,average(a)); return 0; }
char *format; format=“a=%d, b=%d\n”; printf(format, a,b);
相当于:
printf(“a=%d, b=%d\n”, a,b);
2015/12/23 21
12.4.1 字符串的表示方式
常见编程错误
char *p; scanf(“%s”, p); 写出上面代码的人的可能想法:

赋值:
字符数组(整体)不能赋值 : char a[20]; a[20]=“I am a teacher”; /*错误!*/ a=“I am a teacher”; /*同样错误!*/ 指针变量可以赋值: char *p; p=“I am a teacher”; /*首地址赋给p*/

2015/12/23

指向数组的指针变量的运算
加1:指向下一个相邻的同类型数组
减1:指向前一个相邻的同类型数组
如:
int a[2][3], (*p)[3]=a; printf(“%p\n”, p); p++; printf(“%p\n”, p); VC下运行结果:
2015/12/23
10
12.3.2 指向数组的指针变量
三维数组 所指二维数组 二维数组所指一维数组 a a[0] 或 *a b b[0] 或 *b b[0][0] 或 **b
也可以表示出所指数组的邻居,如: *(b+1)
2015/12/23 7
12.3.1 指向数组的不可变指针
利用指向数组的指针,还可以进一步表示出它
所指数组中的下标变量(这是最终目的)
注:指针变量的基类型,需与一维数组的类型相同 如:int a[4], (*p)[4]; p=&a; //不能写成 p=a; 如:int a[3][5], (*p)[5]; p=a;
2015/12/23
int a[4], (*p)[4]=&a;
int a[3][5], (*p)[5]=a;
9
12.3.2 指向数组的指针变量
2015/12/23
14
第四节 指针与字符串
本节主要内容
1 字符串的表示方式
2 用指针变量处理字符串
2015/12/23
15
12.4.1 字符串的表示方式

概述
C语言中没有字符串类型的变量 存储字符串,通常都是开辟连续的内存单元(字
符数组),将字符串的每个字符存为一个字节,
最后添加一个空字符 程序中表示一个字符串,可采用两种方式
H str[0] e str[1] l str[2] l str[3] o str[4] ! str[5] „\0‟ str[6]
2015/12/23
17
12.4.1 字符串的表示方式

指针变量表示法
定义指针变量并初始化 char *p=“Hello!”; 先定义指针变量,然后再赋值 char *p; p =“Hello!”;

字符数组表示法 指针变量表示法
2015/12/23
16
12.4.1 字符串的表示方式

字符数组表示法
可以在定义数组时初始化 char str[ ]=“Hello!”; 也可以先定义数组,然后再存字 符串 char str[10]; strcpy(str, “Hello!”); 说明:一般来说,字符数组都是局 部的,在执行到数组定义一行时, 会在动态存储区分配空间
可以从键盘输入一个字符串,并存到
p之中
系统会将键盘输入的字符串存好,并将地址存
到p中 错误原因:

2015/12/23
p是存地址的,不可能存字符串
内存中没有空间用来存字符串
22
12.4.2 用指针变量处理字符串

例:主函数程序框架如下所示,请填写代码,以便 将两个字符串按从小到大顺序(字典顺序)输出 int main() { char *p1=“Fortran”, *p2=“Basic”; /*-------------------------*/ /* */ /*-------------------------*/ printf(“%s,%s\n”, p1,p2); return 0; }
H e l l o ! \0
2356
说明:
2356
p
字符串是在程序装载时以字符数组的形式存储的(在文字 常量区),但由于字符数组没有名字,故无法通过数组名 访问该字符串
程序运行时,系统才给指针变量p分配空间(动态存储区) 对p初始化或赋值时,系统把字符串的地址存入p p指向字符串的第一个字符而不是整个字符串
void sub(_____) { …… }
2015/12/23
//用两种方法定义两种参数
13
练习2:
int a[2][3]; int *p=a[0], (*q)[3]=a;
__________ ; //输入a[0][0]的值,利用数组名表示a[0][0] (用下标法)
__________ ; //输入a[0][1]的值,利用数组名表示a[0][1] (用指针法)
2015/12/23
解法2:把p定 义成指向变量 的指针变量, 参看教材
12
练习1:
int main() { int a[3][4]={7,1,0,9,3,5,4,6,10,2,8,11}, *p=a[0]; _______; //调用sub函数让数组中每个数据都变成原来的2倍 for(i=0;i<=11;i++) printf(“%d\n”, *(p+i)); return 0; }
指向指针变量
point, &point[0]...
int **p;
指向变量的指针和指针数组,可用来表示变量(含下标变量) 指向数组的指针,可用来表示数组,也可进一步表示数组中的下标
变量 指向指针变量的指针,可用来表示指针变量,也可进一步表示变量
2015/12/23 2
第二节 指向变量的指针
本节主要内容
__________ ; /*输入a[0][2]的值,利用指针变量 (用下标法), 此处的指针
变量是指向变量的 */
__________ ; /*输入a[1][0]的值,利用指针变量 (用指针法), 此处的指针 变量是指向变量的*/ __________ ; /*输入a[1][1]的值,利用指针变量 (用下标法), 此处的指针 变量指向一维数组 */ __________ ; /*输入a[1][2]的值,利用指针变量 (用指针法), 此处的指针 变量指向一维数组*/
2015/12/23
4
12.2.2 指向变量的指针变量

定义
int *p1; float *p2; 说明:指向变量的指针变量,定义时不带任何括号

特点
指向变量的指针变量,是用来存变量的地址的,但 它所存地址并非固定不变,它可以先存这个变量的 地址,再存另一个变量的地址,即:它所指对象是 可以改变的

应用
用来间接访问变量及相邻的变量
5
2015/12/23
第三节 指向数组的指针
本节主要内容
1 指向数组的不可变指针 2 指向数组的指针变量 3 指向数组的指针变量的适用场合
2015/12/23
6
12.3.1 指向数组的不可变指针
设有数据定义 int a[2][3], b[2][2][3]; 则a用作指针时就是一个指向一维数组的指针,b 用作指针时是一个指向二维数组的指针,在数组 存在期间,它们都是不可变的。 利用指向数组的指针a和b,可以表示出它们所指 的数组,如下表所示
1 指向变量的不可变指针
2
指向变量的指针变量
2015/12/23
3
12.2.1 指向变量的不可变指针

设有数据定义 int a, b[3], c[2][3]; 则&a, b, &b[0], &b[1], &b[2], c[0], c[1], &c[0][0]...都是 指向变量的指针,在变量(数组)生存期内,这些指 针的值是固定的,不可变的 上面指针各自指向的变量如下:
例如:对于二维数组名
a
a[0][0] a[1][0]
a a+1
a[0] a[1]
2015/12/23
8
12.3.2 指向数组的指针变量
指向数组的指针变量的定义
(以指向一维数组的指针变量为例)
格式:类型 (*指针变量名)[元素个数]
如:int (*p)[5];
//p用来存放int[5]型数组的地址
20
作为指针,字符数组名不可变,而 指针变量的值可以改变
int main() { char *p=“I love China”; p+=7; printf(“%s\n”, p); return 0; }
I
l o v
p
e
C h i n a
„\0‟
运行结果:
China
p
字符指针变量可以替代字符串作 实参,如:
指向数组的指针变量的用途
可用来表示数组或数组中的变量
例:利用指向数组的指针变量输出二维数组的数据
int a[3][4]={1,2,3,4,5,6}, (*p)[4]=a, i, j; for(i=0;i<=2;i++) for(j=0;j<=3;j++) printf(“%5d”, *(*(p+i)+j)); 循环部分还可写为: for(i=0;i<=2;i++) for(j=0;j<=3;j++) printf(“%5d”, *(*p+i*4+j)); 或: for(j=0;j<=11;j++) printf(“%5d”, *(*p+i));
2015/12/23
23
12.4.2 用指针变量处理字符串

题目析:
程序执行时,内存中状态如图所示 输出顺序是 :p1为首址的串、 p2为首址的串 若原顺序正合适,不需要操作,直接输出 若原顺序不合适,需要调整,方法:
指针类型
指向变量
指针举例
&a,&b[0],b+1,c[1],d[0][2]...
指针变量的定义
int *p;
指针数组
指向一维数组 指向二维数组 指向函数 &b,c,c+1,d[0],d[1]... &c,d,d+1... max
int *point[5];
int (*p)[4]; int (*p)[3][4] int (*p)(int,int);
19
12.4.1 字符串的表示方式

字符数组法和指针变量法的异同点
类型不同,空间大小不同
字符数组:栈区数组,存储字符串的每一个字符及空字符 指针变量:常量区数组存串,栈区指针变量存串首址

赋初值类似:
字符数组初始化: char a[]=“hello”; 字符指针变量: char *p=“hello”;
指针 所指变量
&a a b b[0] &b[0] &b[1] &b[2] b[0] b[1] b[2] c[0] c[1] &c[0][0] &c[0][1] c[0][0] c[0][1] c[0][0] c[1][0]

利用上面的指针可以表示出它们所指的变量及相邻的变 量,如:*b=1; 又如:*(b+1)=2;
第十二章 指针综述

指针类型简介
二 三 四
指向变量的指针 指向数组的指针 指针与字符串
主要内容
七 八
五 六
指针与函数
指针数组 指向指针变量的指针
带参数的main函数

动态内存分配
1
2015/12/23
第一节 指针类型简介

C语言中常用的指针类型如下表所示
数据定义
int a; int b[4]; int c[3][4]; int d[2][3][4]; int *point[5]; int max(int x,int y) { ...... }
2015/12/23 18
12.4.1 字符串的表示方式
验证:
int main() { char *p=“Hello!”; printf(“%c,%c\n”, *p,*(p+1)); return 0; }
2356
H e l l o ! \0
p p+1
2356
p
运行结果: H,e
2015/12/23
相关文档
最新文档