版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 指 针,指针是C 语言中的一个重要概念,是C 语言的 精华、灵魂。,1. 内存单元地址 程序中定义了变量后,在编译时系统就给这个变量分配内存单元。内存中每一个内存单元都有一个编号,这就是“地址”。 内存单元地址 就是编译后系统分配给变量的内存空间位置。 例如: int i , j, k;,8.1 地址和指针的概念, 数据在内存中的存取方式:直接访问方式 和 间接访问方式。 直接访问方式:按变量地址存取变量值。 间接访问方式: 把一个变量的地址放在另一个变量中。, 内存单元的内容 内存单元中存放的数值。 例如:i=3 ;j=6 ; 在2000单元中存放数值 3,3 即为内容。 在2002
2、单元中存放数值 6,6 即为内容。,例: printf(%d, i ) ; 其执行是这样的:根据变量名与地址的对应关系,找到变量i 的地址2000,然后从由2000开始的两个字节中取出数据(即变量的值3),把它输出。 这种按变量地址存取变量值的方式称为“直接访问”方式。,例如,我们定义一个变量 i_pointer ,用来存放整型变量i 的地址: i_pointer = /* 把变量 i 的地址赋给变量 i_pointer */ 这时i_pointer的值 就是变量 i 所占用的内存单元的起始地址(2000)。 如何存取变量i 的值?,间接访问方式: 通过存储在某一个内存单元中的地址去存取该地址
3、所指向的内存单元中的变量值。,要存取变量i 的值,先要找到存放i 的地址的变量(i_pointer),从中取出i 的地址(2000),然后到2000、2001字节中取出i 的值(3)。,表示将数值3送到变量中,有两种方法: 将3 送到变量i 所标志的单元中。 将3 送到变量i_pointer 所“指向”的单元中。 所谓“指向”就是通过地址来体现的。 (如右图所示),由于通过地址可以找到所需的变量单元,因此可以说,地址“指向”该内存单元。在C 语言中,将地址形象化地称为“指针”。 一个变量的地址称为该变量的“指针”。例如地址2000是变量i的指针。 如果有一个变量,专门用来存放另一个变量的地址(
4、即指针),则它称为“指针变量 ”。如前面所说的i_pointer变量称为指针变量。指针变量的值是指针(地址)。 注意:(1) “指针” 和 “指针变量” 这两个不同的概念。 (2) 通过指针变量如何访问变量 i 的值? (间接访问),变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指向另一个变量。 指针变量和它所指向的变量之间,用“ * ” 表示“ 指向”。 例如 i_pointer代表指针变量,* i_pointer 是i_pointer所指向的变量。,8.2 变量的指针和指向变量的指针变量,可以看到,* i_pointer也代表一个变量,它和变量i 是同一回事。下面两个语句作用
5、相同: i=3; * i_pointer=3; 第个语句的含义是将3 赋给指针变量i_pointer所指向的变量。,8.2.1 定义一个指针变量,指针变量是专门用来存放地址的,因此必须定义为“ 指针类型”。 指针变量定义的一般形式: 基类型 * 指针变量名 指针变量的基类型 用来指定该指针变量可以指向的变量的类型。 例如: int *pointer_1,*pointer_2 ;(指向整型变量的指针变量) float *pointer_3;(指向实型变量的指针变量) char *pointer_4;(指向字符型变量的指针变量),注意: 1. 指针变量前面的“ * ” 表示该变量是指针变量。 指针
6、变量名是 pointer_1、pointer_2 ,而不是*pointer_1、*pointer_2 . 2. 在定义指针变量时必须指定基类型。 不同类型的数据在内存中所占的字节数是不同的。 指针变量的类型说明 是为了告诉系统按变量中的地址从内存选取几个字节的数据进行操作,便于 指针的移动和指针的运算操作。 3. 一个指针变量只能 指向同一类型的变量,即存放同一类型变量的地址。,怎样使一个指针变量指向另一个变量呢? 可以使用赋值语句。 例如: float x ; char ch ; float * pointer_3 ; char * pointer_4 ; pointer_3 = ,例: i
7、nt k, i=5; int *pointer; pointer=,输出变量 i 的值5,k的值为5,8.2.2 指针变量的引用,指针变量中只能存放地址(指针),不能将一个整型量或任何其它非地址类型的数据赋给一个指针变量。 例如赋值语句:pointer_1=2000; (不合法),有关地址的运算符: 1. int *pointer_1 ,*pointer_2; /*定义指针变量,指向整型变量*/ a=100; b=10; pointer_1= ,例8.1 通过指针变量访问整型变量。,运行结果: 100,10 100,10,pointer_1 指向a,*pointer_1 就是变量a 。 poi
8、nter_2 指向b, *pointer_2就是变量b 。, scanf(%d,%d, ,例8.2 输入整数a和b,按先大后小的顺序输出a和b 。,运行结果: a=5 , b=9 max=9 , min=5,实际上并没有交换a 和b。算法不交换整型变量的值(变量a和 b中的值没有改变),而是交换两个指针变量的值(即变量a和 b的地址),使p1指向大的数,p2指向小的数。,8.2.3 指针变量作为函数参数,例:对输入的两个整数按大小顺序输出。,#include void main() void swap(int *,int *); int ,; int *pointer_,*pointer_;
9、scanf(,); pointer_ ; pointer_2 ; if() swap( pointer_ , pointer_2 ); printf(,); ,void swap(int *,int *) int temp; temp*1; *; *temp; ,例:对输入的三个整数按大小顺序输出。,#include void main() int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d, ,void exchange(int *q1,int *q2,int *q3) if(*q1*q2)s); if(*q1*q3)s); if(*q2*q3)s); ,void s
10、 *pt1,int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; ,一个变量有地址,一个数组包含若干元素,每个元素在内存中占用存储单元,它们也应该有相应的地址。一个变量既然可以指向变量,当然也可以指向数组和数组元素。 所谓数组的指针是指 数组的起始地址。数组元素的指针是数组元素的地址 。 例如:int a10 , i , *p, *p1; p= a; 或 p=,8.3 数组的指针和指向数组的指针变量,引用数组元素可以用下标法(如a3),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占用内存少,运行速度快
11、)。,8.3.1 指向数组元素的指针,例如: int a10; int *p; . p=,指向数组元素的指针变量,其定义与普通指针变量的定义相同。,把元素a0 的地址赋给 p, 即p指向 数组a 的第0个元素。 因为数组名表示数组的首地址,所以它 等价于 p=a ; 应注意数组a 并不代表整个数组,而是把数组a 的首地址赋给指针变量p,不是把数组a 的各个元素赋给p。,假设已经定义了数组和一个指针变量 int a10; int *p=a; . *p=1;,数组元素的引用可以用 1. 下标法: ai 2. 指针法: *(a+i) 或 *(p+i) 其中p 为指向数组a 的指针变量,初值 p=a;
12、 下标法比较直观,程序容易阅读,指针表示,8.3.2 通过指针引用数组元素,对p 当前所指的元素 赋整数值1,注意: C规定 :p+1 (或p+) 指向同一数组的下一个元素 (不是地址值简单加1)。p+1代表的实际地址是 p+1d(d是一个数组元素所占的字节数)。 当 p 的初值为 a 的首地址时, p+i 或 a+i 就是ai 的地址,因为 a 代表了数组的首地址。 *(p+i) 或*(a+i) 所指的数组元素就是ai 的内容。 实际上, 是变址运算符,对ai 的处理,是将ai 按a+i 计算地址,然后找出此地址单元中的值。 指向数组的指针变量也可以带下标, 如: pi 等价于*(p+i)
13、,即ai 。,例8.5 输出数组中全部元素 :四种方法。,main( ) int a10=1,2,3,4,5,6,7,8,9,10; int *p, i ; printf(n下标法:n) ; for(i=0 ; i10 ; i+) printf(%d, ai) ; printf(n指针法(数组名):n); for(i=0 ; i10 ; i+) printf(%d, *(a+i) ; printf(n指针法(指针变量):n) ; p=a; for(i=0 ; i10 ; i+) printf(%d, *(p+i) ; printf(n指针法(指针变量):n) ; for(p=a ; pa+10
14、 ; p+) printf(%d ,*p) ; printf(n) ; ,否!a+的操作是非法的,因 a是常量。,能否改成如下形式? for(p=a;ap+10; a+) printf(%d,*a),几种方法的比较: 下标法和指针法(数组名)执行效果是相同的。编译系统先将ai 转换为*(a+i),即先计算元素地址,因此这两种方法找数组元素比较费时。 指针变量法是直接指向数组元素,p+的自加操作比较快。 用下标法比较直观。,例 8.6 通过指针变量输入输出数组 a 的10个元素 main( ) int *p , i , a10 ; p=a ; for(i=0 ; i10 ; i+ ) scanf
15、(%d, ,如果输出时没有语句 p=a; 程序将 ?,P是地址,不要加 则:,一、 多维数组的地址 例. 二维数组 int a34=1,3,5,7,9,11,13,15,17,19,21,23; 分析二维数组的性质: a 是一个数组名,包含3个元素: a0,a1,a2。 每个元素又是一个一维数组,包含4个元素。,8.3.4 指向多维数组的指针和指针变量, 从二维数组的角度看,a 代表整个二维数组的首地址,也就是第0行的首地址。 若a 的首地址为2000,因为每一行4个元素,占用8个字节,所以则 a+1的首地址为2008,a+2的首地址为2016。 故a+1 代表第1行的首地址,即a1的地址;a
16、+2 代表第2行的首地址,即a2的地址。, 由于a0 与 *(a+0) 等价,a1 与 *(a+1) 等价,ai 与 *(a+i) 等价,因此ai+j 与*(a+i)+j 等价,它们都是元素aij 的地址。 故:元素aij 的地址表示是: ai+j 或 *(a+i)+j 而 *(*(a+i)+j) 或 *(ai+j) 是元素 aij的值。, a0、a1、a2既然是一维数组名,则它们应代表一维数组的首地址。 a0代表第0行一维数组中第0列元素的地址,即 printf(FORMAT, a , *a) ;1 printf(FORMAT, a0 , *(a+0) ;2 printf(FORMAT, 8
17、 ,(假设系统给数组 a 分配的首地址为 2000) 则运行结果是:,注意: a 是二维数组名,代表数组首地址,不能企图用*a来得到a00的值。 *a 相当于*(a+0) ,即a0,它是第0行地址。 a是行指针,*a是列指针,指向0行0列元素。*a是0行0列元素的值。 a+1指向第一行首地址,不能企图用*(a+1)得到a10的值,而应该用*(a+1) 求a10元素的值。,2000, 2000 2000, 2000 2000, 2000 2008, 2008 2008, 2008 2016, 2016 2016, 2016 9, 9,例 8.12 用指针变量输出数组元素的值。 main( ) i
18、nt a34=1,3,5,7,9,11,13,15,17,19,21,23 ; int *p ; for(p=a0 ; pa0+12 ; p+) printf(%4d , *p) ; ,运行结果: 1 3 5 7 9 11 13 15 17 19 21 23,p-a0:为相距的单元个数,不是字节数 若: a0 2000 p 2008 则: p-a0 = 4,1. 指向数组元素的指针变量,二、指向多维数组的指针变量,if(p-a0)%4 = = 0) printf(n) ;,数组元素在数组中的位置: 计算某个指定的数组元素在数组中的位置(即相对于数组起始位置的相对位移量): 设a是大小为 nm
19、的二维数组,则 元素 aij 在数组中的相对位置的计算公式为: i*m+j 若 p 是一个指针变量,指向二维数组 a 的首地址: p=,若定义: int a34; p= /*p指向 a0*/ 则p+1 不是指向a01,而是a1,p的增值以一维数组的长度为单位。故aij可表示为:*(*(p+i)+j)。,例 8.13 输出二维数组任一行任一列元素的值。,main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23 ; int (*p)4 , i , j ; p=a ; scanf(%d,%d , ,运行结果: 输入: 1, 2 输出: a12=13,说明: aij
20、 的地址可以表示为: *(p+i) + j 。注意*(p+i) + j 不能写成 p+ i+j。 对于数组指针p, p=a; 则p 指向二维数组 a 的第一行首地址 。 对于指针变量 p,p=a0;则 p 指向二维数组 a 的第一行第一列元素首地址, 而 p=a ; 是不合法 的。,void average(float *p, int n) float *p_end; float sum=0 , aver; p_end=p+n-1; for( ; p=p_end; p+ ) sum=sum + (*p); aver=sum/n; printf(average=%6.2n,aver); void
21、 search( float (*p)4 , int n) int j ; printf(the score of No. %d are:n, n); for (j=0 ; j4 ; j+) printf(%5.2f , *(*(p+n)+j) ); ,由于 p 指向一维数组,因此,*(p+n) 是第 n 行的首地址, *(p+n)+j 是 第 n 行第 j 列元素的地址。,运行结果: average=82.25 the score of No.2 are: 90.00 99.00 100.00 98.00,最后一个元素的地址,从指向第一个元素起, 依次指向下一个元素,例 8.15 在上例中,
22、找出有一门以上不及袼的学生,输出其全部成绩。,void search( float (*p)4 , int n) int i , j , flag; for(j=0 ; jn ; j+) flag=0 ; for (i=0 ; i4 ; i+) if(*(*(p+j)+i)60) flag=1 ; if(flag= = 1) printf(No. %d fails , his scores are :n , j+1); for(i=0 ; i4 ; i+) printf(%5.1f , *(*(p+j)+i) ); ,程序运行结果: No.1 fails,his scores are: 65.
23、0 57.0 70.0 60.0 No.2 fails,his scores are : 58.0 87.0 90.0 81.0,8. 4. 1 字符串表示形式 在C程序中,可以用两种方法访问一个字符串。 1. 用字符数组存放一个字符串 例 8.16,main( ) char string = I love China! ; printf(%sn , string) ; 运行结果: I love China!,8.4 字符串的指针和指向字符串的指针变量,字符串常量按字符数组处理,在内存中开辟了一个字符数组来存放字符串常量,这里 string 是数组名,代表这个字符数组的首地址。 stringi
24、就是 *(string+i) 。,2. 用字符指针指向一个字符串 例 8.17 main( ) char *string = I love China! ; printf(%sn , string) ; ,注意: 不能认为string是一个字符串变量,以为是在定义时把“I love China!” 赋给该字符串变量。 通过字符数组名或字符指针变量可以输出一个字符串( %s 的格式),但是不能企图用数组名输出它的全部元素(%d 只能输出一个元素值)。 由于可以用数组或指针来表示字符串,因此对字符串中字符的存取可以用下标法,也可以用指针法。,等价于: char *string; string=I
25、love China!; 定义一个指向字符数据的指针,把该字符串的首地址赋给 string,定义一个指针变量 string ,指向字符串的首地址。,例 8.18 复制字符串 a 到字符串 b。用下标方法:,main( ) char a =I am a boy.; char b20; int i; for(i=0 ; *(a+i)!=0 ; i+) *(b+i)=*(a+i); *(b+i)=0; /* 复制0 */ printf(string a is :%sn,a); printf(string b is :); for(i=0 ; bi!=0 ; i+) printf(%c,bi); pr
26、intf(n); ,运行结果: string a is :I am a boy. string b is :I am a boy.,字符指针作函数参数,用函数调用实现字符串的复制,(1) 用字符数组作参数,#include void main() void copy_string(char from , char to ); char a = am a teacher; char =you are a student; printf(“string a= string ,); printf(“copy string a to string b:n ”); copy_string (,); pr
27、intf(nstring a=%snstring b=%sn,a,b); ,void copy_string(char from , char to ) int ; while(from!) tofrom; to; ,(2) 形参用字符指针变量,#include void main() void copy_string(char * from, char *); char * am a teacher .; char *you are a student ; printf(string a=string ,); printf(copy string a to string b:n ); _(,
28、); printf(nstring a=%snstring b=%sn,a,b); ,void copy_string(char *r,char *) for(;*from!;from,to) *tofrom; *to; ,(3) 对copy string 函数还可作简化,将copy_string函数改写为 void copy_string (char *from,char *) while(*from)!) to;from; , copy_string函数的函数体还可改为 while(*to*from)!); ,copy_string函数的函数体还可写成 while(*from!) *to*
29、from; *to; ,上面的while语句还可以进一步简化为下面的while语句: while(*to*from); 它与下面语句等价: while(*to*from)!); 将*from赋给*to,如果赋值后的*to值等于则循环终止(已赋给*to),函数体中while语句也可以改用for语句: for(;(*to*from)!;); 或 for(;*to*from;);,也可用指针变量,函数copy_string可写为 void copy_string (char from ,char ) char*,*; from; while(*p2*p1)!); ,2. 初始化与赋值方式。 字符指针
30、变量可以在定义时初始化,也可以用赋值语句赋值。 如,char *a =I love China! ; 与char *a ; a=I love China! ; 等价。,8.4.3 字符指针变量与字符数组的讨论,将字符串的首地址 赋给该指针变量。,两者都能用于字符串的存储和运算,但是两者是有区别的: 字符数组由若干元素组成,每个元素中存放一个字符;字符指针变量中存放的是字符串的首地址,决不是将字符串放到字符指针变量中。,3. 数组一经定义,就有了确定的内存单元。 字符指针变量定义后,虽然也分配了内存单元,在没有对指针变量赋初值之前,这个单元中没有一个确定的地址值,因此该指针并未具体指向某个字符数
31、据。,4. 数组名代表该数组的起始地址,它的值不能改变;指针变量的值可以改变 例8.21,main( ) char str =I love China! ; str=str+7 ; printf(%s , str) ; ,main( ) char *a=I love China! ; int j ; printf(The sixth character is %cn , a5) ; for(j=0 ; aj!= 0 ; j+) printf(%c , aj) ; ,运行结果: The sixth character is e I love China!,若定义了一个指针变量,并使它指向一个字符
32、串,就可用下标形式引用指针变量所指的字符串中的字符。 例 8.22,*(a+j),运行结果:China!,不合法,5. 可以用指针变量指向一个格式字符串,用于代替printf 函数中的格式字符串。 例如:,char *format ; format=a=%d,b=%fn ; printf(format , a , b) ;,char format =a=%d,b=%fn ; printf(format , a , b) ;,它相当于 printf(a=%d,b=%fn , a , b) ; 因此,只要改变指针变量format 所指向的字符串,就可以改变输入输出的格式。这种printf 函数称为
33、可变格式输出函数。 也可以用字符数组实现。如,由于不能用赋值语句对数组整体赋值,所以使用指针变量的方式较方便。,指向函数的指针变量定义的一般形式: 数据类型标识符 (*指针变量名) ( ) ;,例如: int (*p)( );,p 所指向的函数的返回值的类型 (即函数值的类型),(*p) 表示 p 先与 * 结合,即说明 p 是指针变量,然后再与后面的 ( ) 结合,表示指针 p 指向函数。,c= max(a , b);,注意: 1. 这里 (*p)( ) 只表示定义了一个存放函数入口地址的指针变量,在把某个函数的地址赋给它之前,并不指向哪个函数,在程序中把某个函数的地址赋给它后才指向这个函数
34、,因此,一个函数指针变量可以先后指向不同的函数。 2. 函数指针变量赋初值:只需给出函数名而不必给出参数 如: p=max; 3. 用指针变量调用函数时,只用 (*p) 代替函数名即可。 如: c=(*p) (a , b) ; 4. 指向函数的指针变量的算术运算没有意义,例如:p+ , p+n , p- -,这里 *p 外面的 ( ) 不能省,int max(x,y) int x,y; return(xy?x:y); ,调用 p 所指向的函数,8.7.1 指针数组 指针数组 数组元素均为指针类型数据, 即每个元素都是指针变量。 指针数组的定义形式: 类型标识 *数组名 数组长度 例如: int
35、 *p4,例如: 若干个字符串的排序和查找。 由于字符串本身就是一个字符数组,而各个字符串的长度又不同,因此用二维数组处理不太方便。 如果用指针数组,使各元素分别指向各个字符串,那么只要改变指针数组中各元素的指向,就可对所指的字符串进行排序。,注意与 int (*p)4 的区别!,8.7 指针数组和指向指针的指针,由于 的优先级高于* , p 先与 结合表示数组,然后 p 再与 * 结合,表示数组是指针类型,int 表示每个数组元素指向一个整型变量.,例如:有若干字符串,长短不一,可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串。如果想对字符串排序,不必改动字符串的位置,只需改动
36、指针数组中各元素的指向。这样,各字符串的长度可以不同,且移动指针要比移动字符串所花的时间少得多。,void print(char *name , int n) int i; for(i=0 ; in ; i+) printf(%sn, namei) ; ,#include main( ) void sort(char *name , int n ); void print(char *name , int n); char *name =Follow me, BASIC, Great Wall, FORTRAN, Computer design; int n=5; /* 字符串个数 */ so
37、rt(name , n) ; print(name ,n) ; ,void sort(char *name , int n) char *temp; int i , j , k ; for(i=0 ; i0) k=j; if (k != i) temp=namei; namei=namek; namek=temp; ,例8.27 将n 个字符串按字母顺序(由小到大)排序输出( 设 n=5 ),运行结果: BASIC Computer design FORTRAN Follow me Great Wall,定义形式: 类型标识 * 变量名 例如: char *p,由于*是从右到左结合,因此 *p
38、 相当于 *(*p),8.7.2 指向指针的指针,例如: char *name5; char *p ; p=name +2; printf(%on, *p) ; printf(%sn , *p) ;,例8.28 使用指向指针的指针,main( ) char *name =Follow me, BASIC, Great Wall, FORTRAN, Computer design ; char *p ; int j ; p=name ; for(j=0 ; j5 ; j+) printf(%sn , *(p+j) ; ,以%o 输出name2的值(地址),以%s 输出name2的字符串Great
39、 Wall,运行结果: Follow me BASIC FORTRAN Great Wall Computer design,main( ) int a5=1,3,5,7,9 ; int *num5= ,例 8.29,运行结果: 13579,8.8.1 指针类型的小结,8.8 指针类型和指针运算的小结,指针运算有如下几种: 1. 指针变量 可以和整数进行加(减),例如: p+ , p- - , p+i , p-i , p+=i , p-=i ; 注意:p+ 1 指的是加 1 个单位,即 p 所指向的变量占用的内存字节数,如 p是指向 整型变量的指针,则加 2个字节。 2. 指针变量可以赋值(赋
40、地址),例如: p= ( NULL 表示整数 0 ),在 stdio.h 中有定义:#define NULL 0 任何指针变量或地址都可以与NULL作相等或不相等的比较,如 if(p=NULL) 4. 两个指针变量可以相减,即 p2 - p1 ,表示两个指针之间的元素个数。 但p1+p2 无意义。 5. 若两个指针指向同一个数组的元素,则可以进行比较, 例如: p1p2 , p1=p2 .,8.8.2 指针运算小结,它可以用来表示指向一个抽象的数据类型。例如: char *p1 ; void *p2 ; p1=(char *) p2 ; 把 p2 强制转换为指向字符变量的指针。 也可以将一个函
41、数定义为 (void *)类型,例如: void *fun(char ch1 , char ch2),指针是C语言中重要的概念。使用指针的优点是: (1) 提高效率 ; (2) 被调函数可以改变主调函数的值,即可以返回多个值; (3) 可以实现动态存储分配。,8.8.3 void 指针类型,指针变量如何定义,指针和地址的关系,如何对指针进行运算? 如何定义和使用以下对象:指针数组、数组指针、指针的指针、函数指针、返回值为指针的函数。 如何使用字符指针? 如何通过指针来改变函数实在参数的值? 什么是命令行参数?如何正确使用?,本 章 要 点,习 题 八 (一),(一)填空 (1) 写出建立图一所
42、示的存储结构所需的定义语句: char_. (2) 写出图一所示的存储结构所需的赋值语句: _=B ; p=_. (3) 写出用指针变量 p 输出字符变量的语句: printf(%cn ,); (二)填空 (1) 写出建立图二所示的存储结构所需的定义语句: int _ , _ ; (2) 写出图二所示的存储结构所需的赋值语句: p=_ ; (3) 写出用指针变量 p 输出数组 s 每一个元素值的语句: for(j=0 ; j6 ; j+) printf(%dt , _) ; (4) 要使 p指向数组的最后一个元素 ,改变 p的表达式是。,(三)填空 (1) 写出建立图三所示的存储结构所需的定义
43、语句: float _ , _ , _ ; (2) 写出图三所示的存储结构所需的赋值语句: k =_ ; s =_ ; p=_ ; (3) 用指针变量 s 输出 k 的值语句: ; (4) 用指针变量 p 输出 k 的值的语句: ;,(四)写出以下程序运行结果。,(1) #include main( ) int a , *ap ; a=100 ; ap= ,(4) main( ) int c =1,7,12 , *p ; p=c ; printf(%d , *+p) ; (5) #include main( ) char *ap , *s ; int j , n ; s=Happy New Y
44、ear ; ap=s ; for(n=0 ; *s ! = 0 ; +s , +n) ; for(j=0 ; jn ; +j) putchar(*ap+) ; ,习 题 八(二),(一 ) 写出以下程序运行结果,(1) #include main( int argc , char *argv ) printf(%d %s , argc , argv1+1) ; 若执行命令为 test hello worl d (2) #include main( ) int a=10 , b=80 ; int *p1= ,(3) int x =1 , 2 ; int y =4 , 5 , 6 ; int z
45、=7 , 8 , 9 ; int *a =x , y , z ; main( ) int *t ; printf(%dt , *a0) ; t=a0+1 ; printf(%dt , *t) ; t=a1 ; printf(%dt , *t) ; printf(%dt , *(t+1) ; printf(%dn , *(a+2) ; ,(4) main( ) char *p ; int m ; p=abcdef ghijk! ; m=len (p) ; printf(length of = %dn , p , m) ; len (char *ptr) int j ; for(j=0 ;* pt
46、r+ != 0 ; j+) ; return( j ) ; ,例1. 查12个月英文单词。,main( ) int n ; char *month_name( ) ; scanf(%d , ,3、 int a10 ; void input( ) int j ; for(j=0 ; j=max) max=*(a+j) ; n=j ; if(m0) temp=*(a+0) ; *(a+0)=*(a+m) ; *(a+m)=temp ; if(n9) temp=*(a+9) ; *(a+9)=*(a+n) ; *(a+n)=temp ; ,void print( ) int j ; for(j=0
47、; j10 ; j+) printf(%4d , *(a+j) ; main( ) input( ) ; change( ) ; print( ) ; ,指针习题解答,6、 #include main( ) int len(char *ptr) ; char s80 , *p ; int m ; gets(s) ; p=s ; m=len(p) ; printf(%d , m) ; int len(char *ptr) int n ; for( n=0 ; *ptr!=0 ; ptr+) n+ ; return( n ) ; ,7、 #include #include main( ) void copystr(char *p1 , char *p2 , int n) ; int m ; char str180 , str280 ; printf(Input a string:n) ; gets(str2) ; printf(Input m:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《LD集团借壳上市的绩效分析》
- 2023年河南省考省直单位(河南省人民检察院郑州铁路运输分院)笔试真题
- 机械购买合同范本
- 2024年度林地租赁承包协议
- 2024年度货物买卖合同书(含售后服务)
- 2024年度劳动力外包合同
- 2024版北京小汽车租赁车辆购置合同
- 二零二四年国际品牌服装授权销售合同
- 2024版设备租赁合同租赁期限及租金
- 2024年度房屋代理出租合同
- 乐理(一)知到章节答案智慧树2023年丽水学院
- 2023春国开电大《实用管理基础》形考任务1-4参考答案
- 女生生理卫生课 课件
- 细胞通过分化产生不同类型的细胞【高效备课精研+知识精讲提升】 高一生物 精讲课件(浙科版2019必修1)
- 教科版科学五年级上册教学计划(新版本)
- 田赛高度成绩记录表
- 柴油安全技术说明书
- 电力系统分析智慧树知到答案章节测试2023年东北电力大学
- 孤立性肺结节的CT诊断
- 公共关系学形考任务四答案
- 学生手机(电子手表)携带申请表
评论
0/150
提交评论