實驗9 ?指針概念及指針與一維數(shù)組的關(guān)系
任務(wù)1 ?理解指針及其使用方法
1.閱讀分析下面程序,寫出運(yùn)行結(jié)果,理解指針概念及“*”與“&”的含義。
#include <stdio.h>
main()
{
????int a,b;
????int *p1,*p2;
????a=100; b=10;
????p1=&a;
????p2=&b;
????printf("a=%d,b+2= %d\n",a ,b+2);
????printf("*p1=%d,*p2+2= %d\n",*p1,*p2+2 );
}
運(yùn)行結(jié)果為:
a=100,b+2= 12
*p1=100,*p2+2= 12
2.上機(jī)驗證下列程序的運(yùn)行結(jié)果。
#include <stdio.h>
void main(?)
{
????int a,b,*p1,*p2;
????p1=&a;
????p2=&b;
????a=5;
????b=7;
????printf("\na=%d,b=%d,p1=%dp2=%d",a,b,p1,p2);
????printf("\n&a=%d,*&a=%d,&b=%d,*&b=%d\n",&a,*&a,&b,*&b);
}
運(yùn)行結(jié)果如下:(下面紅色標(biāo)記的字,是漏寫了的)
a=5,b=7,p1=1245052,p2=1245048
&a=1245052, *&a=5,&b=1245048,?*&b=7
思考:在本題中,可不可用&*a來代替*&a?
不能代替,上機(jī)驗證通不過。所以*號只能寫在地址或指針變量的前面,不能寫在普通變量的前面。
3.分析下面程序,并運(yùn)行,理解用指針變量進(jìn)行輸入、輸出。
#include <stdio.h>
main(?)
{
????int *p,m;
????scanf("%d",&m);
????p=&m; ????????????/*指針p指向變量m*/
????printf("%d",*p); ???/*p是對指針?biāo)傅淖兞康囊眯问?/span>,與此m意義相同*/
}
如從鍵盤上輸入:5
????則運(yùn)行結(jié)果為:5
上述程序可修改為如下:
#include <stdio.h>
main(?)
{
????int *p,m;
????p=&m;
????scanf("%d",p) ; ???/*p是變量m的地址,可以替換&m*/
????printf("%d",m);
}
如從鍵盤上輸入:5
????則運(yùn)行結(jié)果為:5
任務(wù)2 ?使用指針訪問一維數(shù)組
1.閱讀分析下面程序,寫出運(yùn)行結(jié)果,理解指針與數(shù)組關(guān)系。
#include<stdio.h>
main(?)
{
????int a[]={1,2,3,4,5,6,7,8,9};
????int *p=a,b,c,s=0;
????for(b=0;b<3;b++)
???????for(c=0;c<3;c++)
?????????if(b==c) ?{ p++; s+=*p; }
????printf("s=%d",s);
}
運(yùn)行結(jié)果為:s=9
2.閱讀下面程序,理解指針、數(shù)組的多種表示法
#include<stdio.h>
main(?)
{
????int a[]={1,2,3};
????int *p,k;
????p=a;
????for(k=0;k<3;k++)
????{
??????printf("a[%d]=%d\n",k,a[k]);
??????printf("p[%d]=%d\n",k,p[k]);
??????printf("*(p+%d)=%d\n",k,*(p+k));
??????printf("*(a+%d)=%d\n",k,*(a+k));
????}
}
運(yùn)行結(jié)果為:
a[0]=1
p[0]=1
*(p+0)=1
*(a+0)=1
a[1]=2
p[1]=2
*(p+1)=2
*(a+1)=2
a[2]=3
p[2]=3
*(p+2)=3
*(a+2)=3
3.在空格中填上語句,以實現(xiàn)字符串復(fù)制的功能。
#include<stdio.h>
main( )
{
????char *ps="C language";
????char str[15];
????char *p1,*p2;
????p1=ps;
????p2=str;
????while(*p1!='\0')
????{
???????*p2=*p1?;
????????p1++ ?;
????????p2++ ?;
????}
????*p2='\0';
????printf("ps=%s\n",ps);
????printf("str=%s\n",str);
}
運(yùn)行結(jié)果為:
ps=C language
str=C language
4.下面程序完成從鍵盤輸入兩個字符串a和b,再將a和b的對應(yīng)位置字符中的較大者存放在數(shù)組c中,當(dāng)一個字符串結(jié)束時停止比較,此時將另一個字符串剩下的字符直接放在數(shù)組c的后面,填空完成該程序。
#include <stdio.h>
#include <string.h>
void main( )
{
????int k=0;
????char a[80],b[80],c[80]={'\0'},*p,*q;
????p=a;q=b;
????gets(a);
????gets(b);
????while( ?*p&&*q ?)
????{
??????if(??*p>*q ?) ?c[k]=*p;
??????else ?c[k]=*q;
??????p++;
????????q++ ?;
??????k++;
????}
????if(*p!= '\0') ?strcat(c,p);
????else ?strcat(c,q);
????puts(c );
}
5.指出下面程序的問題所在(輸出a數(shù)組的10個元素),理解指針與數(shù)組下標(biāo)的關(guān)系及指針變化情況。
void main( )
{
????int a[10];
????int *p,k;
????p=a;
????for(k=0;k<10;k++)
????{ *p=k; p++; }
????for(k=0;k<10;k++,p++)
??????printf("%d,",*p);
}
運(yùn)行結(jié)果為:輸出10個隨機(jī)數(shù),原因是當(dāng)?shù)谝粋€for循環(huán)結(jié)束后,指針已經(jīng)指到最后一個元素的下一個地址,此時再輸出,已經(jīng)輸出的不是原來存儲的數(shù)據(jù)了。
6.編程實現(xiàn)從鍵盤輸入10個整數(shù),然后求出其中最小值(采用指針實現(xiàn))。
參考程序如下:
#include<stdio.h>
main( )
{
????int a[10],min;
????int *p,k;
????p=a;
????for(k=0;k<10;k++)
????{ scanf("%d",p);p++; }
p=a;
????min=a[0];
????for(k=0;k<10;k++,p++)
if(min>*p)min=*p;
????printf("%d",min);
}
?
?
?
實驗10 ?指針與二維數(shù)組、函數(shù)的關(guān)系
任務(wù)1 ?使用指針訪問二維數(shù)組
1.閱讀并運(yùn)行下列程序,理解訪問二維數(shù)組元素的多種方法。
#include<stdio.h>
void main( )
{
????int a[3][4];
????int i,j;
????for(i=0;i<3;i++)
??????for(j=0;j<4;j++)
????????scanf("%d",&a[i][j]); ???/*數(shù)組元素下標(biāo)表示法*/
????for(i=0;i<3;i++)
????{
????????for(j=0;j<4;j++)
???????????printf("%4d",*(*(a+i)+j));/*數(shù)組元素指針表示法*/
????????printf("\n");
????}
????printf("\n");
????for(i=0;i<3;i++)
????{
????????for(j=0;j<4;j++)
???????????printf("%4d",*(a[i]+j)); ?/*數(shù)組元素下標(biāo)+指針表示法*/
????????printf("\n");
????}
????printf("\n");
}
如果從鍵盤上輸入:1 2 3 4 5 6 7 8 9 10 11 12
則運(yùn)行結(jié)果為:
??1 ??2 ??3 ??4
??5 ??6 ??7 ??8
??9 ?10 ?11 ?12
?
??1 ??2 ??3 ??4
??5 ??6 ??7 ??8
??9 ?10 ?11 ?12
2.分析下面程序的輸出結(jié)果,理解指針與二維數(shù)組以及數(shù)組指針的概念。
#include <stdio.h>
void f(int (*b)[3]);
void main( )
{
????static int a[2][3]={{1,2,3},{4,5,6}};
????f(a);
}
void f(int (*b)[3])
{
????printf("\n%d %d %d\n",b[0][0],b[0][1],b[0][2]);
}
運(yùn)行結(jié)果為:
1 2 3
思考:如將int(*b)[3]改為int(*b)[2],結(jié)果會如何?
???運(yùn)行結(jié)果一樣。
任務(wù)2 ?熟練掌握指針與函數(shù)的關(guān)系
1.下面程序完成截取字符串s中從第m個位置開始的n個字符,返回所截字符串的首地址(即指針型函數(shù)),認(rèn)真閱讀分析程序,寫出運(yùn)行結(jié)果。
#include <stdio.h>
static char sub[20];
void main( )
{
????static char s[]="CLanguageProgram";
????char *cut(char *s,int m,int n),*p;
????p=cut(s,3,4);
????printf("%s\n",p);
}
char *cut(char *s,int m,int n)
{
????int i;
????for(i=0;i<n;i++)
??????sub[i]=s[m++-1];
????sub[i]='\0';
????return sub;
}
運(yùn)行結(jié)果為:
angu
2.調(diào)用子程序,實現(xiàn)求解一維數(shù)組中的最大元素。請?zhí)羁?,完成程序功能?/span>
#include <stdio.h>
main( )
{
????int sub_max(int b[],int i);
????int n,a[10],*ptr=a; ?????/*定義變量,并使指針指向數(shù)組*/
????int max,i=10;
????for(n=0;n<=i-1;n++)
??????scanf("%d",&a[n]);
????max=??sub_max(a,i) ?; ?/*函數(shù)調(diào)用,其實參是指針*/
????printf("max=%d\n",max);
}
int sub_max(int b[],int i) ??????/*函數(shù)定義,其形參為數(shù)組*/
{
????int temp,j;
????temp=b[0] ;
????for(j=1;j<i;j++)
????if(temp<b[j]) temp=b[j];
????return temp;
}
此題無空可填,已經(jīng)是一個完整的程序,它的功能是求從鍵盤輸入10數(shù)中最大的那個數(shù)。故自己選一個地方加了藍(lán)色和下劃線,讓學(xué)生理解這個地方。
3.閱讀下面程序,理解利用指向指針的指針變量對二維字符數(shù)組的訪問方式。
#include <stdio.h>
#include <stdlib.h>
main( )
{
????int i;
????static char c[][16]={"c language","fox","computer","home page"};
????static char *cp[]={c[0],c[1],c[2],c[3]};
????static char **cpp; ??/*指向字符指針的指針變量*/
????cpp=cp; ???????????????/*將指針數(shù)組的首地址傳遞給指向字符指針的指針變量*/
????for(i=0;i<4;i++) ????/*按行輸出字符串*/
??????printf("%s\n",*cpp++);
????printf("-----------\n");
????for(i=0;i<4;i++)
????{
??????cpp=&cp[i];
??????printf("%s\n",*cpp);
????}
}
運(yùn)行結(jié)果如下:
c language
fox
computer
home page
----------
c language
fox
computer
home page