1.上机目的
(1)掌握指针的概念、会定义和使用指针变量;
(2)能正确的使用数组的指针和指向数组的指针变量;
(3)能正确的使用字符串的指针和指向字符串的指针变量;
(4)能正确的使用指向函数的指针变量;
(5)掌握动态内存分配函数的使用方法;
(5)了解指向指针的指针的概念和使用方法。
2.上机内容
(1)例8.10,归纳一下,数组作为函数参数时,形参与实参的对应关系如何?
形参只有在函数被调用过程中才分配存储单元,调用结束后形参占用的单元被释放。数组元素作为实参时,也做为变量来处理
(2)分别定义两个函数(并且要求用指针做函数参数),实现选择和冒泡排序算法?
(3)例8.12, 8.13,请谈谈你对二维数组中行指针和列指针的理解?
分为行指针和列指针
(4)例8.18、8.20、8.23、8.24
(5)学会使用动态内存分配函数:
在<stdlib.h> 和<alloc.h>中均定义了下面的函数
void* malloc(unsigned int size);
向系统申请大小为size的内存块,把首地址返回。如果申请不成功,返回NULL
void *calloc(unsigned int num, unsigned int size);
向系统申请num个size大小的内存块,把首地址返回。如果申请不成功,返回NULL
void free(void* p);
释放由malloc()和calloc()申请的内存块。p是指向此块的指针.
一维动态数组的使用:
#include<stdio.h>
int main()
{
void sort(int [],int n);
int i,*p,a[10];
p=a;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;
sort(p,10);
for(i=0;i<10;i++)
{printf("%d",*p);
p++;
printf("\t");}
return 0;
}
void sort(int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k]) k=j;
if(k!=i)
{t=x[i];x[i]=x[k];x[k]=t;
}
}
}
冒泡法排序 :
#include<stdio.h>
int main()
{
void swap(int *p,int n);
void sort(int *p,int n);
int a[10],i;
printf("input number:");
for(i=0;i<10;i++)
scanf("%d",a[i]);
swap(a,10);
sort(a,10);
return 0;
}
void swap(int *p,int n)//冒泡法
{
int i,j,t,*p1;
p1=p;
for(j=0;j<n-1;j++)
{for(i=0;i<n-j;i++)
if(*(p+i)>*(p+i+1))
{t=*(p+i);*(p+i)=*(p+i+1);*(p+i+1)=t;}}
printf("ther sorted number:");
for(i=0;i<n;i++)
printf("%d",*p1);
printf("\n");
}*/
void sort(int *p,int n) //选择法
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(*(p+j)>*(p+k)) k=j;
if(k!=i)
{t=*(p+i);*(p+i)=*(p+k);*(p+k)=t;}
for(i=0;i<n;i++)
printf("%d",*p);
printf("\n");
}
}
例题20:
#include<stdio.h>
int main()
{
int max(int,int);
int min(int,int);
int (*p)(int,int);
int a,b,c,n;
printf("please enter a and b:");
scanf("%d%d",&a,&b);
printf("please choose 1or2:");
scanf("%d",&n);
if(n==1) p=max;
else if(n==2) p=min;
c=(*p)(a,b);
printf("a=%d,b=%d\n",a,b);
if(n==1) printf("max=%d\n",c);
else printf("min=%d\n",c);
return 0;
}
int max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
return z;
}
int min(int x,int y)
{
int z;
if(x<y) z=x;
else z=y;
return z;
}
例题23
#include<stdio.h>
int main()
{
void fun(int x,int y,int (*p)(int,int));
int max(int,int);
int min(int,int);
int add(int,int);
int a,b,n;
printf("please enter a and b:");
scanf("%d%d",&a,&b);
printf("please choose 1or2,3:");
scanf("%d",&n);
if(n==1) fun(a,b,max);
else if(n==2) fun(a,b,min);
else if(n==3) fun(a,b,add);
return 0;
}
void fun(int x,int y,int (*p)(int,int))
{
int result;
result=(*p)(x,y);
printf("%d\n",result);
}
int max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
printf("max=");
return z;
}
int min(int x,int y)
{
int z;
if(x<y) z=x;
else z=y;
printf("min=");
return z;
}
int add(int x,int y)
{
int z;
z=x+y;
printf("sum=");
return z;
}
例题24
#include<stdlib.h>
#include<stdio.h>
void main()
{
int *p=NULL,n,i,sum;
printf("Please enter array size:");
scanf("%d",&n);
p=(int*)malloc(n*sizeof(int));
if(p==NULL)
{
printf("No enough memory!\n");
exit(0);
}
printf("Please enter the score:");
for(i=0;i<n;i++)
scanf("%d",p+i);
sum=0;
for(i=0;i<n;i++)
sum=sum+*(p+i);
printf("aver=%d\n",sum/n);
free(p);
}
一维数组:
#include<stdio.h>
int main()
{
void copy_string(char from[],char to[]);
char a[]="I am a teacher.";
char b[]="You are a student.";
char *from=a,*to=b;
printf("string a=%s\nstring b=%s\n",a,b);
printf("\ncopy string a to string b:\n ");
copy_string(from,to);
printf("string a=%s\nstring b=%s\n",a,b);
return 0;
}
void copy_string(char from[],char to[])
{
int i=0;
while(from[i]!='\0')
{to[i]=from[i];i++;
}
to[i]='\n';
}
二维数组:
#include<stdlib.h>
main()
{
int *pScore=NULL,i,j,m,n,maxScore,row,col;
int FindMax(pScore,3,4,*row,*col);
printf("Please enter array size m,n:");
scanf("%d,%d",&m,&n);
pScore=(int*)calloc(m*n,sizeof(int));
if(p==NULL)
{
printf("No enough memory!\n");
exit(0);
}
printf("Please enter the score:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&pScore[i*n+j]);
maxScore=FindMax(pScore,3,4,&row,&col);
printf("maxScore=%d,class=%d,number=%d\n",maxScore,row+1,col+1);
free(pScore);
}
int FindMax(int*pScore,int m,int n,int*row,int*col)
{
int i,j,max=*pScore;
*row=0;
*col=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
if(*pSore>max)
{
max=*pScore;
*row=i;
*col=j;
}
pScore++;
}
return max;
}
习题4:
#include<stdio.h>
int main()
{
void move(int [20],int,int);
int a[20],n,m,i;
printf("input n:");
scanf("%d",&n);
printf("input %d number:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("input m:");
scanf("%d",&m);
move(a,n,m);
for(i=0;i<n;i++)
{printf("%d",a[i]);
printf("\t");}
return 0;
}
void move(int a[20],int n,int m)
{
int *p,array;
array=*(a+n-1);
for(p=a+n-1;p>a;p--)
*p=*(p-1);
*a=array;
m--;
if(m>0)
move(a,n,m);
}
#include<stdio.h>
int main()
{
void aver(int (*score)[5],int n);
void bujige(char *name,int(*score)[5],int n);
void youxiu(char *name,int(*score)[5],int n);
int i,j;
int score[4][5];
char name[9];
for(i=0;i<4;i++)
{printf("请输入第%d个学生的姓名:",i+1);
scanf("%s",name);
printf("请输入该学生的成绩:");
for(j=0;j<5;j++)
scanf("%d",&score[i][j]);
}
aver(score,5);
bujige(name,score,5);
youxiu(name,score,5);
return 0;
}
void aver(int (*score)[5],int n) //第一科平均成绩
{
int i,j=0;
float z=0.0;
for(i=0;i<4;i++)
z+=*(*(score+i)+j);
z=z/4;
printf("第一门课的平均成绩为:%f",z);
}
void bujige(char *name,int(*score)[5],int n) //不及格学生
{
int i,j,k,t=0,z=0;
for(j=0;j<4;j++)
{
for(i=0;i<n;i++)
{
if(*(*(score+j)+i)<60) t++;
}
if(t>=2)
{
printf("姓名:%s",*(name+j));
for(k=0;k<5;k++)
{
printf("第%d课成绩:%d",k+1,*(*(score+j)+k));
z+=*(*(score+j)+k);
}
printf("该学生平均成绩是:%d",z/4);
}
}
}
void youxiu(char *name,int(*score)[5],int n) //优秀学生
{
int i,j,z=0,t=0;
for(i=0;i<4;i++)
{
for(j=0;j<n;j++)
{z+=*(*(score+i)+j);
if((*(*score+i)+j)>85) t=1;}
if((z/5)>90||t==1)
{printf("姓名:%s",*(name+i));
for(j=0;j<n;j++)
printf("第%d科成绩为:%d",j+1,*(*(score+i)+j));
}
}
}
习题17
#include<stdio.h>
int main()
{
int strcmp(char *p1,char *p2);
int m;
char s1[20],s2[20],*p1,*p2;
printf("input s1,s2:");
scanf("%s",s1);
scanf("%s",s2);
p1=&s1[0];
p2=&s2[0];
m=strcmp(p1,p2);
printf("%d\n",m);
return 0;
}
int strcmp(char *p1,char *p2)
{
int i,z;
i=0;
while(*(p1+i)==*(p2+i))
if(*(p1+i++)=='\0')
return 0;
else z=*(p1+i)-*(p2+i);
return z;
}