首页计算机计算机软件计算机语言与程序设计 10 指针程序练习.ppt

10 指针程序练习.ppt

页数:23页文件大小:286.0 KB来源: 计算机语言与程序设计ppt课件

本课件是一组指针程序练习,收录八段示例程序并逐段讲解:从指针变量的赋值与输出,到用指针遍历数组、处理字符串、在函数间传递地址,再到指针数组与多级指针的综合用法。每段程序都配有运行结果说明与常见错误提示,用于把第九讲的指针概念真正转化为可运行的代码能力。

第十讲指针程序练习章节封面页,标示本讲通过八个小程序练习指针
定义部分代码页,定义字符数组s、指针t与指针数组p并给出测试提示
续定义页,定义二级指针数组q与三级指针变量r并给出测试Q1
查看本课件的文字版(共 23 页,供检索与复制)

第1页:第十讲指针程序练习封面

本页为第十讲 指针程序练习章节封面,本讲通过 8 个小程序反复练习字符指针、指针数组与多级指针的用法。

第2页:练习1.c的定义部分

//指针程序练习1.c #include <stdio.h>void main(){ int i; char s[] = "abcdef"; char* t = "abcdef"; char* p[]={"abcdef","ghijk","lmnop","qrstuv"};

第3页:练习1.c的指针数组q与r

// q为指针数组变量,q数组元素依次指向char** q[]={p,p+2,p+3,p+1};//而q又是指向指针数组p的指针 char** *r=q;printf("----------------------%s\n",*p);printf("Q1:下述等式成立吗?p[0]= *(p+0) = *p\n\n");

第4页:练习1.c的输出与判断

if ( p[0] ==*(p+0) &&(p[0]== *p)) printf("\tYES!\n");printf("输出*p为%s\n",*p);printf("输出*(p+0)为%s\n",*(p+0));printf("输出p[0]为%s\n",p[0]);printf("\t成立!\n");}

结论:p[0]、*(p+0)、*p 三者完全相同,输出均为字符串 abcdef。

第5页:练习2.c的定义部分

//指针程序练习2.c void main(){ int i; char s[] = "abcdef"; char* t = "abcdef"; char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; char** q[]={p,p+2,p+3,p+1};

第6页:练习2.c的测试Q2

// r为3级指针变量,是指向指针数组q的指针 char** *r = q ; printf("Q2:下述等式成立吗?q[2]= *(q+2)=&(p[3])=p+3\n\n"); if (q[2]==*(q+2) && q[2] == &(p[3]) && q[2] == p+3 ) printf("\n\t成立!\n");printf("输出q[2]为%X\n",q[2]);printf("输出*(q+2)为%X\n",*(q+2));printf("输出&p[3]为%X\n",&p[3]);printf("输出p+3为%X\n",p+3);}

结论:q[2]、*(q+2)、&p[3]、p+3 四者都表示 p[3] 的地址。

第7页:练习3.c的定义部分

//指针程序练习3.c void main( ){ int i; char s[] = "abcdef"; char* t = "abcdef"; char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; char** q[]={p,p+2,p+3,p+1};

第8页:练习3.c的测试Q3

// r为3级指针变量,是指向指针数组q的指针 char** *r = q;printf("Q3:下述等式成立吗?r[0][0] = s\n"); printf("\nr[0][0] = q[0][0] = p[0][0] = p[0]\"abcdef\"\n"); if (r[0][0] == s) printf("\n\t成立!\n\n");}

结论:r[0][0] = q[0][0] = p[0][0] = p[0],与字符数组 s 一样都指向字符串 abcdef。

第9页:练习4.c的定义部分

//指针程序练习4.c void main(){ int i; char s[] = "abcdef"; char* t = "abcdef"; char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; char** q[] = {p,p+2,p+3,p+1};

第10页:练习4.c的测试Q4

// r为3级指针变量,是指向指针数组q的指针 char** *r = q ;printf("Q4:下述等式成立吗?r[0][0]=*(r[0]+0)=*(r[0])=*(*(r+0))=*(*r)=**r\n"); if (r[0][0] == *(r[0]+0) && r[0][0] == *(r[0]) && r[0][0] == *(*(r+0)) && r[0][0] == *(*r) && r[0][0] == **r) printf("\tYES! YES! YES!\n"); 

第11页:练习4.c的输出语句

printf("输出r[0][0]为%s\n",r[0][0]); printf("输出*(r[0]+0)为%s\n",*(r[0]+0)); printf("输出*(r[0])为%s\n",*(r[0])); printf("输出*(*(r+0))为%s\n",*(*(r+0))); printf("输出×(*r)为%s\n",*(*r)); printf("输出**r为%s\n", **r); }

说明:源文件中「输出×(*r)」的“×”为排版符号,实际应为 *(*r)。

第12页:练习5.c的定义部分

//指针程序练习5.c #include <stdio.h>void main(){ int i; char s[] = "abcdef"; char* t = "abcdef"; char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; char** q[] = {p,p+2,p+3,p+1};

第13页:练习5.c的Q5前段

// r为3级指针变量,是指向指针数组q的指针char** *r = q ;printf("Q5:请观察下列结果\n");printf("r变量本身的地址&r add1: %X\n", &r);printf("r变量指向的地址r add1: %X\n", r);

第14页:练习5.c的Q5后段

//输出*r指向的地址 printf("*r指向的地址*r add1: %X\n", *r);printf("r[0]指向的地址r add1: %X\n", r[0]);printf("**r指向的地址r add1: %X\n", **r);printf("*r[0]指向的地址r add1: %X\n", *r[0]);printf("**r指向的内容r add1: %s\n", **r);printf("*r[0]指向的内容r add1: %s\n", *r[0]); }

本练习要求对照输出结果,弄清 &r、r、*r、r[0]、**r、*r[0] 各自表示的是哪一级的地址或内容。

第15页:练习6.c的定义部分

//指针程序练习6.c #include <stdio.h>void main(){ int i; char s[] = "abcdef"; char* t = "abcdef"; char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; char** q[] = {p,p+2,p+3,p+1};

第16页:练习6.c的Q6前段

// r为3级指针变量,是指向指针数组q的指针char** *r = q ;printf("Q6:请观察下列结果\n");printf("r变量本身的地址&r add1: %X\n", &r);printf("r变量指向的地址r add1: %X\n", r);

第17页:练习6.c的Q6后段

//输出*r指向的地址 printf("*r指向的地址*r add1: %X\n", *r);printf("r[1]指向的地址r add1: %X\n", r[1]);printf("**r指向的地址r add1: %X\n", **r);printf("*r[1]指向的地址r add1: %X\n", *r[1]);printf("**r指向的内容r add1: %s\n", **r);printf("*r[1]指向的内容r add1: %s\n", *r[1]); }

注意:由于 q 的元素依次指向 p[0]、p[2]、p[3]、p[1],所以 r[1] 对应的是 p[2],*r[1] 指向的字符串是 lmnop。

第18页:练习7.c的定义部分

//指针程序练习7.c #include <stdio.h>void main(){ int i; char s[] = "abcdef"; char* t = "abcdef"; char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; char** q[] = {p,p+2,p+3,p+1};

第19页:练习7.c的Q7前段

// r为3级指针变量,是指向指针数组q的指针char** *r = q ;printf("Q7:请观察下列结果\n"); printf("r[1]的内容: %s\n", *r[1]); printf("r[0]+2:%X\n", r[0]+2); printf("r[2]: %X\t*r+2:%X\n", r[2], *r+2);

本页重点观察 r[0]+2、r[2]、*r+2 三个地址之间的关系。

第20页:练习7.c的Q7后段

printf("r[2]变量本身的地址&r add1: %X\n", q[2]); printf("r变量本身的地址&r add1: %X\n", q[0]+2); printf("r变量指向的地址r add1: %X\n", r); printf("*r指向的地址*r add1: %X\n", *r); printf("r[2]指向的地址r add1: %X\n", r[2]); printf("**r指向的地址r add1: %X\n", **r); printf("*r[2]指向的地址r add1: %X\n", *r[2]); printf("**r指向的内容r add1: %s\n", **r); printf("*r[2]指向的内容r add1: %s\n", *r[2]); }

结论:r[2] 为 &p[3],故 *r[2] 指向的字符串是 qrstuv。

第21页:练习8.c的定义部分

//指针程序练习8.c #include <stdio.h>void main(){ int i; char s[] = "abcdef"; char* t = "abcdef"; char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; char** q[] = {p,p+2,p+3,p+1};

第22页:练习8.c的Q8前段

// r为3级指针变量,是指向指针数组q的指针char** *r = q ;printf("Q8:请观察输出结果\n\n");printf("输出r[3][2]所指向的字符串%s\n", r[3][2]);printf("输出r+3所指向的地址: %X\n", (r+3));printf("输出r+3地址中的值所指向的地址: %X\n",*(r+3));

第23页:练习8.c的Q8后段

printf("输出r+3地址中所指向的地址加上偏移量2后的地址:%X\n", *(r+3)+2); printf("输出*(*(r+3)+2)所指向的地址: %X\n\n", *(*(r+3)+2)); printf("输出r[3][2]所指向的地址r[3][2]: %X\n", r[3][2]); printf("输出*(r[3]+2)所指向的地址*(r[3]+2): %X\n", *(r[3]+2)); printf("输出*(*(r+3)+2)所指向的地址*(*(r+3)+2): %X\n",*(*(r+3)+2)); printf("输出*(*(r+3)+2)所指向的字符串*(*(r+3)+2): %s\n",*(*(r+3)+2)); }

结论:r[3][2] 与 *(r[3]+2)、*(*(r+3)+2) 等价,均指向同一个字符串元素。