C语言实验程序、总结 实验七 指针

时间:2024.4.21

实验七  指针

一  实验目的

1  了解指针的概念,学会定义和使用指针变量。

2  掌握指针、变量和数组的关系及使用方法。

3  学会使用指向函数的指针变量。

二  实验内容

1  编写函数fun(float *sn,int n),其功能是:根据以下公式计算s,计算结果通过形参sn传回;n通过实参传入,n的值大于等于0。上机运行并记录输入输出(主函数已给出)。

fun(float *sn,int n)

定义变量s,通项w符号f循环控制变量i;    /*  其中s、f要初始化 */

 循环求累加和s

 {  改变符号;               /*  由负变正或由正变负      */

求通项w;

累加:s+=w;

 }

 形参指针变量sn赋值;        /*  通过形参sn传回累加和s  */

}

main()

{  float s;  int n;

 printf("n=");  scanf("%d",&n);

 fun(&s,n);

 printf("s=%f\n",s);

}

完整程序如下:

#include<stdio.h>

void  fun(float *sn,int n)

{  float s=0.0,w,f=-1.0;

int i=0;

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

{  f=(-1)*f;

w=f/(2*i+1);

s+=w;

}

*sn =s;

}

main()

{  float s;  int n;

printf("n=");  scanf("%d",&n);

fun(&s,n);

printf("s=%f\n",s);

}

输出结果如下图:

2  想使指针变量pt1指向a和b中的大者,pt2指向小者,以下程序能否实现此目的?

swap(int *p1,int *p2)

{  int *p;

 p=p1;p1=p2;p2=p

}

main()

{  int a,b;  int *pt1,*pt2 ;

 scanf("%d,%d",&a,&b);

 pt1=&a; pt2=&b ;

 if(a<b) swap(pt1,pt2);

 printf("%d,%d \n",*pt1,*pt2) ;

}

上机调试此程序。如果不能实现题目要求,指出原因并修改之。

子函数swap改成下面程序方可实现目的,主函数不变:

swap(int *p1,int *p2)

{  int p;

   p=*p1;*p1=*p2;*p2=p;

}

3  下面的程序用来实现将一个3×3的矩阵转置。

#include <stdio.h>

void tranf(int (*p)[3])

{  int t,i,j;

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

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

 {  t=p[i][j];  p[i][j]=p[j][i];  p[j][i]=t;  }

}

main()

{  int i,j,a[3][3];

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

 for(j=0;j<3;j++) scanf("%d",&a[i][j]);

 tranf(a);

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

 {  for(j=0;j<3;j++) printf("%3d",a[i][j]);

printf("\n");

 }

}

⑴ 将上面程序修改成将一个N×N的矩阵转置,其中N是符号常量。

⑵ 将tranf函数体中二维数组元素的方括号表示形式改成*号的表示形式。

⑶ 调试并运行程序:N=3,并程序输入:1 2 3 4 5 6 7 8 9,记录程序的输出。

程序修改如下:

#include <stdio.h>

void tranf(int (*p)[N])

{  int t,i,j;

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

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

 {  t=p[i][j];  p[i][j]=p[j][i];  p[j][i]=t;  }

}

main()

{  int i,j;

  Char a[N][N];

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

 for(j=0;j<3;j++) scanf("%d",&a[i][j]);

 tranf(a);

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

 {  for(j=0;j<3;j++) printf("%3d",a[i][j]);

printf("\n");

 }

}

4  记录并分析以下程序运行结果。

#include <stdio.h>

char *strc(char *s1,char *s2)

{  char *p=s1;

 while(*s2!='\0') *p++=*s2++;

 return s1;

}

main()

{  char s1[30]="computer ok!",s2[]="language",*pt;

 pt=strc(s1,s2);

 printf("%s\n",pt);            /*  第10行  */

}

将程序第10行中的%s改成%c,应该怎样修改?(只允许修改第10行)

应改为:   printf("%c\n",*pt++);

实验总结:本次实验主要掌握指针的概念,学会定义和使用指针变量, 掌握指针、变量和数组的关系及使用方法,学会使用指向函数的指针变量,通过本次实验,很好的了解了指针的使用,加深了对指针的认识。


第二篇:C语言教材 第七章 指针 实验


第七章 指针

第一部分 知识训练

【知识要点】

1.  地址与指针

    指针变量的概念:用一个变量专门来存放另一个变量的地址。

2.  指向变量的指针变量

指针变量的形式:基类型  *指针变量名;&: 取地址运算符;*:指针运算符。

3.  指针与数组

    引用一个数组元素可以用下标法和指针法;可以用数组名作函数的参数。

4.   指针与函数

函数指针变量定义的一般形式为:类型说明符  (*指针变量名)();

    一个函数的返回值可以是一个函数。

【典型习题与解析】

5. char * const p;

char const * p

 const char *p

 上述三个有什么区别?

【解析】

char * const p; //常量指针,p的值不可以修改; 

 char const * p;//指向常量的指针,指向的常量值不可以改; 

 const char *p; //和char const *p。

6. main()

{

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

   int *ptr=(int *)(&a+1);

   printf("%d,%d",*(a+1),*(ptr-1));

  }

   输出结果是什么?

 【解析】

 答案:输出:2,5

 *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5。

 &a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)。

 int *ptr=(int *)(&a+1);则ptr实际是&(a[5]),也就是a+5。

  原因如下:

1)   &a是数组指针,其类型为 int (*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。

2)   a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5],  但是prt与(&a+1)类型是不一样的(这点很重要),所以prt-1只会减去sizeof(int*)  a,&a的地址是一样的,但意思不一样。

3)   a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。

【练习题】

一、填空题

1. 指针变量是把内存中另一个数据的    作为其值的变量。

2. 能够直接赋值给指针变量的整数是     

3. 如果程序中已有定义:int k;

1)  定义一个指向变量k的指针变量p的语句是      

2)  通过指针变量,将数值6赋值给k的语句是      

3)  定义一个可以指向指针变量p的变量pp的语句是      

4)  通过赋值语句将pp指向指针变量p的语句是      

5)  通过指向指针的变量pp,将k的值增加一倍的语句是      

4. 当定义某函数时,有一个形参被说明成int *类型,那么可以与之结合的实参类型可以是            等。

5. 以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为:556,则输出十进制整数366。请填空。

#include <stdio.h>

main( )

char *p,s[6];

int n; 

p=s; 

gets(p);

n=*p-‵0‵;

    while(      != '\0')

n=n*8+*p-‵0‵;

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

}

二、选择题

1.变量的指针,其含义是指该变量的(  )。

     A)值       B)地址       C)名       D)一个标志

2.下面程序的运行结果是(  )。

   #include  <stdio.h>

   #include  <string.h>

   main()

   {

     char *s1="AbDeG";

     char *s2="AbdEg";

     s1+=2;s2+=2;

     printf("%d\n",strcmp(s1,s2));

   }

    A)正数       B)负数       C)零       D)不确定的值

3.若有以下定义,则对a数组元素的正确引用是(  )。

int a[5],*p=a;

A)*&a[5]      B)a+2      C)*(p+5)      D)*(a+2)

4.若有以下定义,则p+5表示(  )。

int  a[10],*p=a;

A)元素a[5]的地址          B)元素a[5]的值

C)元素a[6]的地址          D)元素a[6]的值

5. 以下Delblank函数的功能是删除字符串s中的所有空格(包括Tab、回车符和换行符)。

void Delblank(char *s)

int i,t;

char c[80];

for(i=0,t=0;   ①   ;i++)

if(!isspace(    ②    ))c[t++]=s[i];

c[t]=‘\0’;

strcpy(s,c);

}

① A) s[i]   B) !s[i]   C) s[i]=‘\0’    D) s[i]==‘\0’

② A) s+i    B) *c[i]   C) *(s+i)=‘\0’  D) *(s+i)

6. 以下conj函数的功能是将两个字符串s和t连接起来。

char *conj(char *s,char *t)

{   

char *p=s;

while(*s)   ①   ;

while(*t)

{

*s=   ②   ;s++;t++;

}

*s=‘\0’;

       ③    ;

}

① A) s--       B) s++       C) s           D) *s

② A) *t        B) t         C) t--         D) *t++

③ A) return s  B) return t  C) return p    D) return p-t

7. 下列程序的输出结果是(  )。

#include <stdio.h>

main()

{

int **k,*a,b=100;

a=&b;

k=&a;

printf(“%d\n”,**k);

}

A) 运行出错      B) 100      C) a的地址      D) b的地址

8. 若定义了以下函数:

void f(……)

{

……

p=(double *)malloc(10*sizeof(double));

……

}

p是该函数的形参,要求通过p把动态分配存储单元的地址传回主调函数,则形参p的正确定义应当是(  )。

A) double  *p     B) float  **p      C) double  **p       D) float  *p

三、编程题

1.  编写一个程序,将用户输入的字符串中的所有数字提取出来。

2.  通过指针处理下面的问题:利用随机函数模拟产生 300 个 1~12 月出生的人数,统计各月所占的出生率。

【练习题参考答案】

一、填空题

1. 首地址         2. 0       

3. 1)int *p=&k;  2)*p=6;    3)int **pp;  4)pp=&p;  5)(**pp)*=2;

4. 整型数组名、指向整型数据的指针值     5. *(p++)

二、选择题

1. B    2. B    3. D   4. A     5. BD    6. BAC    7. B   8. C

三、编程题

1.  编写一个程序,将用户输入的字符串中的所有数字提取出来。

#include <stdio.h>

#include <string.h>

void main()

{   char string[81],digit[81];

    char *ps;

    int i=0;

    printf("enter a string:\n");

    gets(string);

    ps=string;

    while(*ps!='\0')

    {if(*ps>='0' && *ps<='9')

        {   digit[i]=*ps;

            i++;

        }

        ps++;

    }

    digit[i]='\0';

    printf("string=%s  digit=%s\n",string,digit);

}

2.   通过指针处理下面的问题:利用随机函数模拟产生 300 个 1~12 月出生的人数,统计各月所占的出生率。

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main(int argc, char* argv[])

{

int month[12],*m_pt,i?

m_pt=month?

srand( (unsigned)time( NULL ) )? //srand()函数产生一个以当前时间开始的随机

种子

for (i=0?i<12?i++)

*(m_pt+i)=0?

for (i=0?i<300?i++)

(*(m_pt+rand()%12)) ++?

printf("月份 出生人数 出生率 (总数300)\n")?

for (i=0?i<12?i++)

printf("%3d %6d %2.1f℅ \n",i+1,*(m_pt+i),*(m_pt+i)/300.0*100)?

getchar()?

return 0?

}

第二部分 上机实训

一、   目的要求

1.掌握指针的概念。

2.学会通过指针处理普通变量和一维数组。

3.学会通过指针处理动态分配的内存。

二、   预习内容

    掌握指针变量的使用方法、“&”和“*”的用法、指针变量的赋值、指向数组的指针和指向函数的指针用法。

三、   实验内容及实验步骤

1.要求使用指针处理下面的问题,输入四个整数,按由小到大的顺序输出然后将程序改为:(1)将程序修改为由大到小顺序输出;(2)输入四个字符串,按由小到大顺序输出。

参考程序:

行号  程序代码

1     #include "stdio.h"

2     void main()

3     { int a,b,c,d,t?

4     int *pa=&a,*pb=&b,*pc=&c,*pd=&d?

5     printf("请输入四个整数:")?

6    scanf("%d%d%d%d",pa,pb,pc,pd)?

7    if (*pa>*pb) //第一个数和第二个数比较

8    { t=*pa?*pa=*pb?*pb=t? } //两个数交换

9    if (*pb>*pc) //第二个数和第三个数比较

10    { t=*pb?*pb=*pc?*pc=t? }

11    if (*pc>*pd) //第三个数和第四个数比较

12    { t=*pc?*pc=*pd?*pd=t? }

13    if (*pa>*pb) //第一个数和第二个数比较

14    { t=*pa?*pa=*pb?*pb=t? }

15    if (*pb>*pc) //第二个数和第三个数比较

16    { t=*pb?*pb=*pc?*pc=t? }

17    if (*pa>*pb) //第一个数和第二个数比较

18    { t=*pa?*pa=*pb?*pb=t? }

19    printf("\n 排序结果如下:")?

20    printf("%d,%d,%d,%d\n",*pa,*pb,*pc,*pd )?

21    }

问题 1:将程序修改为由大到小顺序输出。

提示:将程序第 7、9、11、13、15、17 行的“<”号改为“>”号。

问题 2:完成题目的第二部分

提示:对上面的程序作如下修改:

1、打开字符串处理函数的头文件

在第 1 行下面增加 1 行 #include "string.h"

2、将整型变量改为字符串变量

第 3、4 行改为:

char a[100],b[100],c[100],d[100],t[100]?

char *pa=a,*pb=b,*pc=c,*pd=d?

3、将输入整数改为输入字符串

第 6 行改为:

scanf("%s%s%s%s",pa,pb,pc,pd)?

4、将整数比较大小改为字符串比较大小

第 7、9、11、13、15、17 行中原比较整数大小使用字符串比较函数来比较,如第 7 行改为:if (strcmp(pa,pb)>0)

5、将整数赋值改为字符串拷贝

第 8、10、12、14、16、18 行中整数赋值改为使用字符串拷贝函数,如第 8行第 1 个赋值语句改为:strcpy(t,pa)?

6、将整数输出改为字符串输出

第 20 行改为:

printf("\n%s\n%s\n%s\n%s\n\n",pa,pb,pc,pd )?

2. 完善程序,要求使用函数功能:将一个数字字符串转换成一个整数(不得调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。

#include

#include

long fun(char *p)

{

填写程序

}

void main()

{

char s[6];

long n;

printf("Enter a string:\n");

gets(s);

n=fun(s);

printf("%ld\n",n);

}

3. 分析下列程序

(1)#include<stdio.h>

main()

{

char a[10]=”123456789”,*p;

    p=a;

    puts(p);

}

 (2) #include<stdio.h>

main()

{

int max,x,y,*p1,*p2;

    printf(“Input x and y:”);

    scanf(“%d%d”,&x,&y);

p1=&x;

    p2=&y;

    if(*p1>*p2)  max=*p1;

    else  max=*p2;

    printf(“The max number is %d”,max);

}

要求:输入程序,并调试、编译、连接、运行

4. 输入10个整数,将其中最小的数和第一个数对换,把最大的数和最后一个数对换,即把最小数放到最前面,把最大数放到最后面。(用指针实现)

5. 用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。整数和n在主函数中输入。最后在主函数中输出。

更多相关推荐:
C语言程序设计实验报告——张蒙蒙

重庆邮电大学移通学院C语言程序设计实验报告学生张蒙蒙学号0214110122班级一班专业数字媒体重庆邮电大学移通学院1重庆邮电大学移通学院目录第一章基础掌握311实验目的错误未定义书签12实验要求313实验基本...

C语言程序设计实验报告

C语言程序设计实验报告实验一C程序的运行环境和运行一个C程序的方法实验目的1了解所用的计算机系统的基本操作方法学会独立使用该系统2了解在该系统上如何编辑编译连接和运行一个C程序实验内容1调用教材P4例11程序并...

C语言程序设计实验报告

C语言程序设计实验报告实验名称计算出1000以内10个最大素数之和实验目的1熟练掌握ififelseifelseif语句和witch语句格式及使用方法掌握if语句中的嵌套关系和匹配原则利用if语句和switch...

《C语言程序设计实验》实验报告

C语言程序设计实验实验报告指导老师专业班级学号姓名日期20xx0529重庆邮电大学计算机科学与技术学院实验一实验名称一维数组程序设计实验目的1熟练掌握使用一维数组编程的方法2熟练掌握排序算法实验内容1调试示例输...

C语言程序设计实验报告

C语言程序设计实验报告1实验目的1.熟练掌握while语句、do-while语句和for语句及使用方法,掌握三种循环控制语句的循环过程以及循环结构的嵌套,利用三种循环语句实现循环结构;2.掌握简单、常用的算法,…

C语言程序设计实验报告9

C语言程序设计实验报告九专业计算机科学与技术班级卓越工程师班日期20xx年12月23日实验组别第一组成绩第九次实验结构与联合实验指导教师李开学生姓名学号实验名称结构与联合实验一实验目的1熟悉和掌握结构的说明和引...

C语言程序设计实验报告实验一

C语言程序设计实验报告实验一

《C语言程序设计实验》实验报告

C语言程序设计实验实验报告指导老师专业班级学号姓名日期20xx0529重庆邮电大学计算机科学与技术学院实验一实验名称一维数组程序设计实验目的1熟练掌握使用一维数组编程的方法2熟练掌握排序算法实验内容1调试示例输...

集中上机———C语言程序设计的实验报告

成绩实验名称集中上机C语言程序设计学生姓名学生学号学生专业学生班级指导老师实验时间实验名称c语言运行过程简单c程序设计一实验目的熟悉编程环境运行简单的c程序掌握基本数据类型及它们的使用方法和定义方式熟练掌握赋值...

C语言程序设计实验报告(一)

C语言程序设计实验报告专业班级日期成绩实验组别第次实验指导教师学生姓名学号同组人姓名实验名称指针实验一实验目的1熟练掌握指针的说明赋值使用2掌握用指针引用数组的元素熟悉指向数组的指针的使用3熟练掌握字符数组与字...

C语言程序设计实验报告——实验1 C程序的运行环境和运行C程序的方法

凯里学院C语言程序设计实验报告专业年级班,学号姓名成绩合作者实验日期年月日指导教师评阅日期年月日实验一C程序的运行环境和运行C程序的方法一、实验目的:(1)了解所用的计算机系统的基本操作方法,学会独立使用该系统…

C语言程序设计实训报告

C语言程序设计实训报告班级学生姓名学号指导老师日期20xx629目录1一实训设计性质3二实训设计课题3三实训设计目的3四实训设计任务3五实训设计内容3六实训设计成果4七实训设计总结202一实训设计性质课程设计二...

c语言程序设计实验总结(32篇)