指针练习-16

实验十六  指针的使用

实验要求:

1、掌握指针的定义;

2、理解指针的含义;

3、掌握指针的基本使用;

4、能进行程序调试,并修改程序。

特别要求:

在实验中遇到困难时,切忌不要动不动就问老师,而是应该先思考。如果确实不能解决困难,先与坐在旁边的同学讨论,而无论这个同学在以前是否认识。如果有同学问你问题,无论你是否能解决这个问题,都应该和他讨论。如果讨论了仍然不能解决问题,就一起问老师。讨论问题的好处在于能够深刻的理解问题,记住问题。

程序设计

1.      通过指针变量的加减运算:

有int a=4,b=7,要求定义指针pa,pb,并分别指向a,b,要求输出*pa,*pb;然后再使pa=pa+1,pb=pb+1,然后再输出*pa,*pb;然后再使pa指向a,执行pb=pa+1,然后输出pa,pb,sizeof(pb-pa)。观察结果,理解指针。

 

/*p11_1.c*/

#include <stdio.h>

 

int main()

{  int a=4,b=7,*pa,*pb;

   pa=&a;pb=&b;

   printf("%d %d\n",*pa,*pb);

   pa=pa+1;pb=pb+1;

   printf("%d %d\n",*pa,*pb);

   pa=&a;pb=pa+1;

   printf("%d %d %d\n",*pa,*pb,sizeof(pb-pa));

   return 0;

}

 

2,指向一维数组

定义int a[5]={1,2,3,4,5},*p。要求p指向数组a,要求使用指针方式(*(p+i)、p[i])输出各元素。

/*p11_2.c*/

#include <stdio.h>

 

int main()

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

   p=a;

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

       printf("%d ",*(p+i));

   printf("\n");

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

     printf("%d ",p[i]);

   printf("\n");

   return 0;

}

 

3、输入10个数,按绝对值从小到大排序后输出,要求定义一个函数sort,完成绝对值从小到大排序。函数原型为void sort(int *a,int n),n表示数据个数,a表示数据元素。然后在main函数中调用排序函数sort。

输入样例:

0 -1 -3 7 2 8 9-10 11 5

输出样例

0 -1 2 -3 5 7 8 9-10 11

/*p11_3.c*/

#include <stdio.h>

#include <math.h>

int main()

{  void sort(int *a,int n);

   int i,a[10];

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

     scanf("%d",&a[i]);

   sort(a,10);

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

     printf("%d ",a[i]);

   printf("\n");

   return 0;

}

 

void sort(int *a,int n)

   int i,j,k,temp;

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

   {   k=i;

         for(j=i+1;j<10;j++)

         {

              if(fabs(a[i]) > fabs(a[j]))

              k=j;

         }

         temp=a[k];

         a[k]=a[i];

         a[i]=temp;

   }

}

 

4、有如下定义:

int ival=60021;

int *ip;

double *dp;

下面哪些赋值非法或可能带来错误,并加以讨论。

ival=*ip;  ival=ip;  *ip=ival; ip=ival;  *ip=&ival;

ip=&ival;  dp=ip;  dp=*ip; *dp=*ip;

 

/*p11_4.c*/

ival=*ip; 指针ip没有初始化指向的值也是未知的

 ival=ip;   ip表示指针地址而ival是一个常量的值

*ip=ival;   指针ip没有初始化指向的区域也是未知的

ip=ival;    ip表示的是地址ival表示的是地址对应的值

*ip=&ival;  *ip表示的是地址对应的值&ival表示的是地址

ip=&ival;  正确

dp=ip;     类型不同不能指向

dp=*ip;     地址不能和地址的值赋值

*dp=*ip;     类型不同 等式不成立

 

5、编程实现求字符串长度的函数,返回串长(不包括串结束符)。

int strlen1(const char * s);然后在main函数中调用。要求不能在strlen1中调用strlen函数实现。

 

/*p11_5.c*/

#include <stdio.h>

#include <string.h>

int main()

   int strlen1(const char * s);

   char a[81];

   int i;

   gets(a);

   i=strlen1(a);

   printf("%d\n",i);

   return 0;

}

 

int strlen1(const char * s)

  int i=0;

  while(s[i]!='\0')

  {    i++;

  }

  return i;

}

 

6、编写函数void replace(char *s,char c1,charc2)实现将s所指向的字符串中所有字符c1用c2替换。字符串、字符c1和c2均在主函数中输入,在main函数中将原始字符串和替换后的字符串显示在屏幕上.

输入样例:

Hsajldklasj kkl

a A

输出样例:

HsAjldklAsj kkl

/*p11_6.c*/

#include <stdio.h>

#include <string.h>

int main()

{  void replace(char *s,char c1,char c2);

   char a[81],c1,c2;

   gets(a);

   scanf("%c %c",&c1,&c2);

   replace(a,c1,c2);

   puts(a);

   printf("\n");

   return 0;

}

 

void replace(char *s,char c1,char c2)

   int i;

   for(i=0;s[i]!='\0';i++)

   {

         if(s[i]==c1)

              s[i]=c2;

   }

}

总结(本次实验遇到的问题、解决方法,今后要注意的地方)

1. 定义函数时末尾不加;

2. 忘记输入需要&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值