C语言实践教程

2020-02-21 00:08

实验八 指针

一、目的要求

1. 掌握地址与指针、指针变量的概念; 2. 掌握指针的定义、赋值、使用和传递; 3. 学会正确区分和使用变量的指针和指针变量; 4. 掌握数组指针和指针数组的使用方法; 5. 了解指向函数的指针。

二、预习内容

指针变量的定义、赋值、操作(存储单元的引用,移动指针的操作,指针的比较),取地址运算符(&)和间接运算符(*)的功能,数组元素的多种表示形式。

三、上机内容

【上机题1】 输入并运行以下程序,分析程序运行结果。 #include \void main() { int a,b,c;

int *p,*q,*t; /*指针变量定义*/

p=&a; /* 将变量a的首地址赋给p */ q=&b; t=&c;

scanf(\

*t=a+b; /* 将a+b的和存储在t所指向的地址单元,即存储在c中 */ printf(\ /*按十六进制形式输出a,b的首地址*/ printf(\ /*按十六进制形式输出p,q的首地址*/ printf(\ /*输出a,b的值以及p,q所指向的地址单元的值 */ printf(\ } 分析:

①p=&a; q=&b;t=&c;三条语句分别将a,b,c的首地址赋给指针变量p,q,t,因此&a与p,&b与q,&c与t是等价的。

②指针变量也是变量,因此它们在内存中也有对应的地址单元,&p、&q表示指针变量p、q的首地址。

③int * t;定义了一个指向整型变量的指针变量t,t=&c;表示取变量c的地址,在这里*t与c是等价的。*t=a+b;表示将a+b的值存储在t指向的地址内即存储在c中。

【上机题2】 输入并运行以下程序,分析程序运行结果。 #include \void main() {

int a[5]={1,2,3,4,5},i;

int * p;

p=a; /*将数组a的首地址赋给p*/ for(i=0;i<5;i++) printf(\ printf(\

for(i=0;i<5;i++)

printf(\ /*以数组名a为基地址,i为偏移量,依次输出每个数组元素*/ printf(\

for(i=0;i<5;i++)

printf(\ /*通过不变的p和变化的i,使*( p+i) 依次输出每个数组元素*/ printf(\

for(i=0;i<5;i++)

printf(\ /*由于p指向数组的起始位置,因此p与a等价*/ printf(\

for(;p

如果p指向数组a的首地址,那么a[i]、*(a+i)、*(p+i)、p[i]具有相同的意义,都表示第i个数组元素。

【上机题3】 输入并运行以下程序,分析程序运行结果。 #include \void main() {

int a[2][3]={{0,1,2},{3,4,5}}; int k,j,*p; for(j=0;j<2;j++) {

for(k=0;k<3;k++)

printf(\ /*a[j]是j行首地址,a[j]+k是j行k列元素首地址*/ printf(\ } printf(\ for(j=0;j<2;j++) {

for(k=0;k<3;k++)

printf(\ /* *(a+j)是j行首地址,*(a+j)+k是j行k列元素首地址*/ printf(\ } printf(\

p=a[0]; /*p指向数组的第一个元素*/ for(j=0;j<2;j++) {

for(k=0;k<3;k++)

printf(\ /*输出p所指向的元素*/ printf(\ } } 分析:

①a+j、&a[j]指向第j行是二级指针。

②a[j],*(a+j),&a[j][0]指向第j行第0列是一级指针,注意不要认为*(a+j)是a+j指向的对象,因为在二维数组中a+i是指向行,而不指向具体元素。

③a[j]+k、*(a+j)+k表示第j行第k列元素的地址。 ④*(a[j]+k) 、*(*(a+j)+k)表示元素a[j][k]。 【上机题4】 输入并运行以下程序,分析程序运行结果。 #include \void main() {

char a[ ]=\ char *p;

p=a; /*将字符数组a的首地址赋给p*/ printf(\

printf(\ }

【上机题5】 完成以下程序的上机调试,分析程序运行结果。 #include \void main() {

int a[6],i; int *p ; for(i=0;i<6;i++)

scanf(\ &a[i] ); p=a;

for(i=0;i<6;i++)

printf(\ p[i] ); printf(\} 分析:

① 以上程序用指针实现一维数组的数据输入与输出。

② 如果将以上程序中的语句\p=a;\删去,程序运行结果会怎样?

【上机题6】完成以下程序的上机调试,将a和b的对应位置字符中的较大者存放到数组c中,分析程序运行结果。

#include \#include \void main() { int k=0;

char a[80],b[80],c[80]={\p=a;q=b; gets(a);gets(b); while(*p!='\\0'||*q!='\\0') {

if( a[k]>b[k] ) c[k]=*p; else c[k]=*q; p++; q++ ;k++; }

if(*p!=\else strcat(c,q); printf(\puts(c); }

【上机题7】完成以下程序的上机调试,分析程序运行结果。 #include \void main() {

void sort(int * p1,int * p2); int a,b,* pointer_1,* pointer_2; pointer_1=&a; pointer_2=&b; printf(\ scanf(\ sort( a,b );

printf(\}

void sort(int * p1,int * p2) {

int *temp; temp=p1; p1=p2___; p2=temp ; printf(\} 分析:

①语句\temp=p1;\,以及之后的两条语句是交换p1和p2的值。

②通过上题可以得知,试图通过改变形参指针变量p1和p2的值达到改变实参a,b的值是行不通的。

【上机题8】完成以下程序的上机调试,分析程序运行结果。 #include \void main() {

void sort(int * p1,int * p2,int * p3);

int a,b,c, * pointer_1,* pointer_2,* pointer_3; pointer_1=&a; pointer_2=&b; pointer_3=&c;

printf(\ scanf(\ sort( a, b, c );

printf(\}

void sort(int * p1,int * p2,int * p3) { int t;

if(* p1> * p2){ t=*p1; p1=p2; p2=t; } if(* p1> * p3){ t=*p1; p1=p3; p3=t; } if(* p2> * p3){ t=*p2; p2=p3; p3=t; } } 分析:

①sort函数中的三条if语句是用来交换指针变量p1,p2,p3所指向的变量的值。

②通过改变形参指针变量p1,p2,p3所指向变量的值,可以使得实参a,b,c的值发生改变。 ③如果将上题中的语句\改成\结果正确吗?为什么?

【上机题9】定义函数int f(char *x),统计x所指字符串中字母、数字和其它字符的个数。 【上机题10】从键盘输入一个字符串,编写函数string_copy(char *x,int m,int n),将此字符串中从第m个字符开始的n个字符复制成另一个字符串。

【上机题11】定义函数int f(char *x) 判断x所指的字符串是否为回文,若是则函数返回1,否则返回0。 说明:

回文是指一个字符串顺序输出和逆序输出相同。例如:\就是一个回文。

答案:

【上机题9】 main() { char a[80]; scanf(\f(a); }

int f(char *x) {int i,a,b,c; i=0;a=0;b=0;c=0; while(x[i]!='\\0')

{if(x[i]>='0'&&x[i]<='9') a++;

else if(x[i]>='A'&&x[i]<='Z'||x[i]>='a'&&x[i]<='z') b++; else c++;


C语言实践教程.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:房屋建筑学试题(附答案) - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: