实验10指针做函数参数编程训练

合集下载

C语言实验十指针及其应用.

C语言实验十指针及其应用.

实验十指针及其应用1.已知一个整型数组x[4],它的各元素分别为3、11、8和22.使用指针表示法编程序,求该数组各元素之积。

#include <stdio.h>main(){int x[4]={3,11,8,22},*p,sum=1;for(p=x;p<x+4;p++)sum*=*p;printf("该数组各元素之积为: %d\n",sum);}2.编写程序:输入10个整数至一数组,将其中最小的数与第一个对调,把最大的数与最后一个对调(要求输出对调前后的数组)(1)利用函数调用:#include <stdio.h>void input(int*p,int n){int *pt=p;for(;pt<p+n;pt++)scanf("%d",pt);}void output(int *p,int n){int *pt=p;for(;pt<p+n;pt++)printf("%3d",*pt);printf("\n");}void team(int *p,int n){int *p1,*p2,*c,*d,temp,max,min;p1=p; p2=p+(n-1);max=min=*p1;for(;p1<p+n;p1++){if((*p1)>max) {max=*p1; d=p1;}else if((*p1)<min) {min=*p1; c=p1;} }p1=p;temp=*p1; *p1=*c; *c=temp;temp=*p2; *p2=*d; *d=temp;}main(){int a[10],*pa=a;printf("输入十个数: ");input(pa,10);printf("输出对调前的数组: ");output(pa,10);team(pa,10);printf("输出对调后的数组: ");output(pa,10);}(2)非函数调用法;#include <stdio.h>main(){int a[10],*pa,*p1,*p2,*c,*d,t,max,min;printf("输入十个数: ");for(pa=a;pa<a+10;pa++)scanf("%d",pa);printf("\n输出对调前的数组: ");for(pa=a;pa<a+10;pa++)printf("%3d",*pa);p1=a; p2=a+9;max=min=*p1;for(;p1<a+10;p1++){if((*p1)>max) {max=*p1; c=p1;}else if((*p1)<min) {min=*p1; d=p1;} }p1=a;t=*p2; *p2=*c; *c=t;t=*p1; *p1=*d; *d=t;printf("\n输出对调后的数组: ");for(pa=a;pa<a+10;pa++)printf("%3d",*pa);printf("\n");}3,编写程序:复制一个含有数字字符的字符串到字符数组X中,要求在复制时删除其中的数字字符,之后输出X数组。

指针变量作为函数参数_C语言程序设计案例教程_[共2页]

指针变量作为函数参数_C语言程序设计案例教程_[共2页]
printf("\na=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1, *p2); }
解析:当输入时:5,7↙ 输出:a=5,b=7 max=7,min=5
10.2.3 指针变量作为函数参数
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将 一个变量的地址传送指 针
图 10.8
图 10.9
接着执行 swap 函数的函数体,使*p1 和*p2 的值互换,也就是使 a 和 b 的值互换(见图 10.10)。
函数调用结束后,p1 和 p2 不复存在(已释放)如图 10.11 所示。
int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
对程序的说明: swap 是用户定义的函数,它的作用是交换两个变量(a 和 b)的值。swap 函数的形参 p1、p2 是指针变量。程序运行时,先执行 void main 函数,输入 a 和 b 的值。然后将 a 和 b 的地址分别赋给指针变量 pointer_1 和 pointer_2,使 pointer_1 指向 a,pointer_2 指向 b,如 图 10.8 所示。 接着执行 if 语句,由于 a<b,因此执行 swap 函数。注意实参 pointer_1 和 pointer_2 是指 针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。 因此,虚实结合后形参 p1 的值为&a,p2 的值为&b。这时 p1 和 pointer_1 指向变量 a,p2 和 pointer_2 指向变量 b,如图 10.9 所示。

实验10指针进阶

实验10指针进阶

实验10 指针进阶实验内容程序一计算最长的字符串长度:输入n (n<10)个字符串,输出其中最长字符串的有效长度。

要求自定义函数Int max_len ( char *s[],int n),用于计算有n个元素的指针数组s中最长的字符串的长度。

(作业3)#include <stdio.h>#include <string.h>#include <stdlib.h>int max_len(char *s[],int n);int max_len (char *s[],int n){int max=0;int i=0;int len=0;for(i=0;i<n;i++){len=strlen(s[i]);if(len>max){max=len;}}return max;}int main(){int i,n=0,max;char a[15],*p[20];scanf("%s",a);getchar();while(a[0]!='#'){p[n] = (char*) malloc (sizeof(char)*(strlen(a)+1));strcpy(p[n],a);n++;scanf("%s",a);}max=max_len(p,n);printf("%d\n",max);return 0;}程序二指定位置输出字符串:输入一个字符串后再输人两个字符,输出此字符串中从与第1个字符匹配的位置开始到与第2个字符匹配的位置结束的所有字符。

例如,输入字符串“ program”与2个字符“r”和“g”后,输出“rog”。

要求自定义函数char * match(char*S, char ch1, char ch2)返回结果字符串的首地址。

(作业5)#include <stdio.h>#include <string.h>char c[100];char*match (char*s,char ch1,char ch2) {int i=0;int j=0;int n;n=strlen(s);while(s[i]!='\0'){if(s[i]==ch1){while(s[i]!=ch2){c[j]=s[i];j++;i++;if(j>n)break;}c[j]=s[i];break;}i++;}if(c[j]!=ch2) return NULL;elsereturn c;}int main(){char s[100];char ch1;char ch2;scanf("%s%*c",&s);ch1=getchar();getchar();ch2=getchar();if(match(s,ch1,ch2)!=NULL) printf("%s\n",match(s,ch1,ch2)); else printf("Not found!\n");return 0;}程序三查找子串:输入两个字符串s和t,在字符串s中查找子串t,输出起始位置,若不存在,则输出-1。

指针编程练习题

指针编程练习题

指针编程练习题指针是一种特殊的数据类型,在C语言中有着重要的作用。

通过指针,我们可以直接访问和操作内存中的数据。

为了熟悉和掌握指针的使用,下面将给出一些指针编程练习题供大家参考。

1. 交换两个变量的值请编写一个程序,使用指针来交换两个整数变量的值。

要求在程序中定义两个整数变量a和b,通过指针交换它们的值,并打印交换后的结果。

示例输入:a = 10,b = 20示例输出:交换前:a = 10, b = 20交换后:a = 20, b = 102. 求数组元素的和请编写一个程序,使用指针来计算一个整型数组中所有元素的和。

要求在程序中定义一个整型数组array,并使用指针访问数组中的元素,计算它们的和,并打印结果。

示例输入:array = {1, 2, 3, 4, 5}示例输出:数组元素的和为:153. 查找数组中的最大值和最小值请编写一个程序,使用指针来查找一个整型数组中的最大值和最小值。

要求在程序中定义一个整型数组array,并使用指针访问数组中的元素,找到数组中的最大值和最小值,并打印结果。

示例输入:array = {7, 4, 9, 2, 5}示例输出:最大值为:9最小值为:24. 字符串长度计算请编写一个程序,使用指针来计算一个字符串的长度。

要求在程序中定义一个字符数组string,并使用指针访问字符数组中的元素,计算字符串的长度,并打印结果。

示例输入:string = "Hello, World!"示例输出:字符串长度为:135. 动态内存分配请编写一个程序,使用指针来动态分配内存空间,并进行数据的读写操作。

要求在程序中使用malloc函数动态分配内存空间,读取用户输入的整数值并存储到动态分配的内存中,然后使用指针访问该内存中的数据,并打印结果。

示例输入:请输入一个整数: 10示例输出:读取到的整数为: 10以上是几个指针编程练习题的示例,通过练习这些题目,可以提高对指针的理解和使用技巧。

实验十 指 针

实验十  指 针

} /*注意:swap( )能否写成下面的形式呢? void swap(int *p1,int *p2) {int *p; *p=*p1; *p1=*p2; *p2=*p; } */ /*swap( )能否写成下面的形式呢? void swap(int x,int y) {int t; t=x;x=y;y=t; } */ 例4: 体会指针变量操纵数组元素 main() { int a[6]={1,2,3,4,5,6} int *p; p=a; *(p+3)=*(p+3)+10; printf(“%d,%d\n”,*p,*(p+3)); } 例5: 体会数组作为函数形参的调用机理将数组a中的n个数逆序存放。 void invert(int x[],int n) /* 形式参数采用数组名 */ {int i,temp; for(i=0;i<=(n-1)/2;i++) {temp=x[i];x[i]=x[n-1-i];x[n-1-i]=temp; } } main( ) { int a[10]={1,3,5,7,9,11,13,15,17,19}, i; for(i=0;i<10;i++) printf(“%5d”,a[i]); invert(a,10); /* 实际参数为数组名 */ for(i=0;i<10;i++)
function[2]=fun3; function[3]=fun4; for(I=0;I<4;i++) printf(“fun no.%d->%d\n”,i+1,execute(a,b,function[i])); } execute(int x,int y,int *fun()) { return(*fun)(x,y);} fun1(int x, int y) { return(x+y);} fun2(int x,int y) { return(x-y);} fun3(int x,int y) { return(x*y);} fun4(int x,int y) { return(x/y);} 3、程序 main(int argc,char *argv[]) { while(argc-->1) printf(“%s\n”,*++argv); 的文件名为echo.h,编译后可执行程序名为echo.exe(用DOS时),运行 时输入下面命令行:echo BASIC FORTRAN COBOL PASCL 分析输出结果。

实验十 指针(1).

实验十  指针(1).

实验十指针实验目的1.熟练掌握指针的定义和使用2.掌握指针数组处理字符串3.熟练掌握指针作为函数参数,包括数组名作为函数的参数4.熟练使用字符串处理函数strcmp、strcpy、strlen、strcat。

实验内容1.调试,将5个字符串从小到大排序后输出。

源程序(有错误的程序)#include#includevoid fsort(char cname[][6],int n{ int k,j;char tmp[6];for(k=1;k 调试时设置断点 */for(j=0;jif(cname[j]>cname[j+1]{ t=cname[j];cname[j]=cname[j+1];cname[j+1]=t;}}void main({ int i;char cname[5][6]={“wang”,”li”,”zhang”,”jin”,”xian”}; fsort(cname,5;for(i=0;i<5;i++printf(“%s \n”,cname[i];} /*调试时设置断点*/运行结果(改正后程序的运行结果)JinLiWangXianZhang#include "stdafx.h"#include#includevoid fsort(char cname[][6],int n{ int k,j;char t[6];for(k=1;kfor(j=0;jif(*cname[j]>*cname[j+1]{strcpy(t,cname[j];strcpy(cname[j],cname[j+1];strcpy(cname[j+1],t;}}void main({ int i;char cname[5][6]={"wang","li","zhang","jin","xian"};fsort(cname,5;for(i=0;i<5;i++printf("%s\n",cname[i];}2.编程,输入n(3 个数,输出这 n 个数中的最小值及其下标。

指针数组做函数参数

指针数组做函数参数

指针数组做函数参数
指针数组,即一个数组中存放了多个指针,每个指针指向不同的变量或数组。

在函数参数中,指针数组可以传递多个指针,方便地进行一些操作。

例如,我们可以定义一个int类型的指针数组,用于存储多个整数:
int *arr[5];
其中,arr是一个指针数组,包含5个指针,每个指针指向一个int类型的变量。

在函数参数中使用指针数组,可以通过以下几种方式:
1.使用指针数组作为函数参数
void func(int *arr[]) {
// do something
}
2.使用指针数组的首地址作为函数参数
void func(int **arr) {
// do something
}
3.使用数组名作为函数参数
void func(int arr[][5]) {
// do something
}
这些方式在使用时需要注意指针的类型和指针数组的长度。

在函数中可以通过指针数组来访问数组中的元素,从而进行一些操作。

指针数组作为函数参数的优点在于可以方便地传递多个指针,同时也可以动态地修改数组中的元素。

但同时也需要注意指针的类型和指针数组的长度,以确保程序的正确性。

总之,指针数组作为函数参数具有很大的灵活性和实用性,在C/C++程序设计中应用广泛。

指针变量做函数形参_C语言程序设计_[共3页]

指针变量做函数形参_C语言程序设计_[共3页]
运行情况:
58,79↙ a=58,b=79 a=79,b=58
程序中定义函数 swap( )来实现交换两个变量的值,swap( )函数的两个形参 p1 和 p2 为指针变 量。main( )函数中的“void swap(int *, int *);”的作用是声明被调函数,“int *”表示的是该形参是 一个指向整型数据的指针变量。
第 7 章 指针
程序中变量 m 和 n 的值并未交换,交换的是指针变量 p1 与 p2 的值。p1 初时指向 m,后来 指向 n;p2 初时指向 n,后来指向 m。所以第 2 个输出函数实际上是先输出*p1 即 n 的值,后输 出*p2 即 m 的值,实现了从小到大输出的要求。由于在数据输入之前,已经将指针n,因此,上述程序中的输入函数 scanf( )可以改写为:
scanf("%d,%d",p1,p2);
因为,p1 与 p2 表示的就是变量 m 与 n 的地址。但是要注意不可以写成如下形式:
scanf("%d,%d",&p1,&p2);
7.3 指针变量做函数形参
函数一章中讲到基本类型的变量做函数形参,发生函数调用时实参是确定的数据值。函数的 形参还可以是指针变量,函数调用时实参应该是变量的地址或指向变量的指针变量。发生函数调 用时实参向形参的传递遵循单向值传递规则,传递的内容是实参表示的地址值。这种传递的实质 是将实参的指针值传递给形参指针变量,使得实参指针和形参指针变量指向了主调函数中的同一 个变量。尽管在函数调用中不能改变实参指针的值,但可以在被调函数中通过改变形参指针变量 所指向的变量来改变实参指针所指向变量的值,因为实参指针和形参指针变量指向的是同一个变 量。因此,指针变量做函数形参为被调用函数改变主调函数中的数据提供了手段,增加了函数之 间进行信息传递的渠道,并且克服了函数通过 return 语句只能返回一个数据的局限性。

使用指针作为函数参数,写一交换两个数的函数的算法

使用指针作为函数参数,写一交换两个数的函数的算法

使用指针作为函数参数,写一交换两个数的函数的算法在C语言中,我们可以使用指针作为函数参数来实现一些特定的功能,比如交换两个数的值。

指针是一个非常重要的概念,它可以让我们在不同函数之间共享数据。

下面,我们来详细介绍如何利用指针参数来实现交换两个数的值的函数。

首先,我们需要明确一个概念:指针是一个变量,它存储的是内存地址。

在函数中,我们可以通过传递指针来实现对变量的直接修改。

因此,我们可以定义一个函数,接受两个指针参数,然后交换这两个指针所指向的变量的值。

下面是一个示范交换两个数的函数的代码:void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}//其中,a和b是指向int类型变量的指针,函数内部使用指针所指向的变量进行操作,而不是直接操作指针本身。

我们看一下这个函数的实现方式:1. 首先,我们在参数列表中声明了两个指向int类型变量的指针a和b。

2. 在函数内部,我们使用一个中间变量temp来存储a所指向的变量的值。

3. 然后,我们将b所指向的变量的值赋给a所指向的变量。

4. 最后,我们使用temp将原来a所指向的变量的值赋给b所指向的变量。

通过这种方式,我们就可以在使用函数的时候交换两个数的值。

例如,如果我们想要交换两个变量x和y的值,我们可以使用以下代码:int x = 10;int y = 20;swap(&x, &y);在调用函数swap的时候,我们将变量x和y的地址传递给函数,函数内部可以通过这些地址来修改x和y的值,从而实现交换的功能。

以上就是通过指针作为函数参数实现交换两个数的函数的详细介绍。

通过这种方式,我们可以很方便地在不同的函数之间共享数据,同时也能够提高程序的效率。

在实际编程中,我们可以广泛地应用指针作为函数参数来实现各种功能。

指针做函数形参

指针做函数形参

指针做函数形参指针作为函数形参,在C/C++编程中是一个非常重要的概念。

一方面,它可以减少空间复杂度;另一方面,它可以实现在函数内部修改外部变量的值,从而实现对变量的统一管理。

下面将从以下几个方面具体介绍指针做函数形参的使用方法和注意事项。

第一步,理解指针的基本概念。

指针是一种特殊的变量类型,它存储的是一个地址。

通过指针可以访问和修改相应的内存地址。

在C/C++编程中,常常使用指针来操作数组、字符串和结构体等数据结构,从而实现更加高效和灵活的编程。

第二步,掌握指针作函数形参的语法规则。

在函数定义时,我们可以将一个指针类型变量作为参数,从而实现对该变量的修改。

函数调用时,需要传入该变量的地址,即使用取地址符“&”获取该变量的地址。

例如:```void func(int* p){*p = 10; // 修改p所指向的变量的值}int main(){int a = 5;func(&a); // 将a的地址作为参数传入函数printf("%d", a); // 输出结果:10return 0;}```在上述代码中,我们定义了一个名为“func”的函数,该函数的参数为一个指向int类型变量的指针。

函数内部通过“*p”语法访问和修改p所指向的变量的值。

在主函数中,我们声明了一个变量a,并将其地址通过func函数作为参数传入,从而实现了a的值的修改。

第三步,注意指针类型的匹配。

在指针作函数形参时,需要注意指针类型的匹配,即传入的指针类型必须与函数参数类型相同。

例如,如果我们定义了以下函数:```void func(int* p){*p = 10; // 修改p所指向的变量的值}```则不能将一个指向double类型变量的指针作为参数传入,否则会编译出错。

因此,需要在函数调用时保证传入的参数类型与函数参数类型匹配,从而避免编译错误和运行错误的产生。

第四步,注意指针值的合法性。

实验十 指针与函数

实验十 指针与函数

实验十指针与函数实验目的理解并掌握函数的指针等概念,学会使用指向函数的指针变量,学会编写返回指针值的函数。

要点提示1.函数名代表函数的入口地址,函数的入口地址即为函数的指针。

2.指向函数的指针变量的定义格式:数据类型标识符(*指针变量名)();3.函数的调用可以通过函数名调用,也可以通过函数指针调用。

4.返回指针值的函数定义格式:类型标识符*函数名(形式参数表);5.当函数有多个计算结果或返回值时,可以定义函数返回值的类型为指针类型。

实验内容1.指向函数的指针变量的定义和引用2.返回指针值的函数的定义和引用3.指向函数的指针变量作为函数参数实验步骤读懂并输入程序,完成填空后输出结果。

1. 写一个函数,将字符串中的小写字母转换成大写字母。

在main函数中输入字符串,并输出结果。

main(){ void convert(); /* 函数说明 */char str[10];printf("\nInput a string:");scanf("%s", str);【】printf("\nOutput the string:%s", str);}void convert(char p[10]) /* 函数定义 */{ int i=0;while (*(p+i) !='\0') {if (*(p+i)>='a' && *(p+i)<='z')*(p+i)=*(p+i)-【】; /* 将小写字母转换为大写字母 */i++;}}程序运行结果Input a string: NbaOutput the string: 【】main(){void convert(); /* 函数说明 */char str[10];printf("\nInput a string:");scanf("%s", str);convert(str);printf("\nOutput the string:%s", str);}void convert(char p[10]) /* 函数定义 */{int i=0;while (*(p+i) !='\0'){if (*(p+i)>='a' && *(p+i)<='z')*(p+i)=*(p+i)-32; /* 将小写字母转换为大写字母 */i++;}}Input a string:NbaOutput the string:NBAPress any key to continue实验2main(){ void convert(); /* 函数说明 */char str[10];【】;printf("\nInput a string:");scanf("%s", str);【】;(*p)(str); /* 函数调用 */printf("\nOutput the string:%s", str);}void convert(char p[10]) /* 函数定义 */{ int i=0;while (*(p+i) !='\0') {if (*(p+i)>='a' && *(p+i)<='z')*(p+i)=*(p+i)-32; /* 将小写字母转换为大写字母 */ i++;}}程序运行结果Input a string: NbaOutput the string: 【】main(){void convert(); /* 函数说明 */char str[10];int (*p)();printf("\nInput a string:");scanf("%s", str);p=convert;(*p)(str); /* 函数调用 */printf("\nOutput the string:%s", str);}void convert(char p[10]) /* 函数定义 */{int i=0;while (*(p+i) !='\0'){if (*(p+i)>='a' && *(p+i)<='z')*(p+i)=*(p+i)-32; /* 将小写字母转换为大写字母 */i++;}}Input a string:NbaOutput the string:NBAPress any key to continue实验3{static int score [][4]={{60,70,80,90,},{56,89,67,88},{34,78,90,66}}; int * search(); /* 函数说明 */int * p;int i,m;printf("\nenter the number of stuednt:");scanf ("%d",&m);printf("\nThe scores of No. %d are:\n",m);p=search (score, m);for(i=0;i<4;i++)printf("%d\t",*(p+i));}int * search(pointer,n)int (*pointer)[4]; /* 指向一维数组的指针 */int n;{ float *pt; ;【】;return(pt); ;}程序运行结果:enter the number of stuednt:1The scores of No. 1 are:【】main(){static int score [][4]={{60,70,80,90,},{56,89,67,88},{34,78,90,66}};int * search(); /* 函数说明 */int * p;int i,m;printf("\nenter the number of stuednt:");scanf ("%d",&m);printf("\nThe scores of No. %d are:\n",m);p=search (score, m);for(i=0;i<4;i++)printf("%d\t",*(p+i));}int * search(pointer,n)int (*pointer)[4]; /* 指向一维数组的指针 */int n;{float *pt; ;pt=pointer+n-1;return(pt); ;}enter the number of stuednt:1The scores of No. 1 are:60 70 80 90 Press any key to continue实验4main(){ double (*function[3])();double x=1;int i;function[0]=sin;function[1]=cos;function[2]=tan;for (i=0; i<3; i++)printf("func No: %d---%d\n", i+1, execute(x, 【】); }execute (double x, 【】){ return ((*func)(x));}程序运行结果:func No: 【】func No: 【】func No: 【】#include <math.h>main(){double (*function[3])();double x=1;int i;function[0]=sin;function[1]=cos;function[2]=tan;for (i=0; i<3; i++)printf("func No: %d---%d\n", i+1, execute(x, function[i])); }execute (double x, double (*func)()){return ((*func)(x));}func No: 1---0func No: 2---0func No: 3---1Press any key to continuedouble execute (double x, double (*func)()){return ((*func)(x));}main(){double (*function[3])();double x=1;int i;function[0]=sin;function[1]=cos;function[2]=tan;for (i=0; i<3; i++)printf("func No: %d---%f\n", i+1, execute(x, function[i])); }func No: 1---0.841471func No: 2---0.540302func No: 3---1.557408Press any key to continue。

指针作为函数参数

指针作为函数参数

指针作为函数参数《函数引用传递》一节,我们介绍了用作函数形参的引用变量,引用变量其实就是原始变量的别名,该原始变量用作实参。

这样的设计使得函数可以访问原始实参变量,从而允许它更改变量的内容。

当为一个变量传入一个引用形参时,则认为该实参是按引用传递的。

按引用传递实参还有一种替代方法,那就是使用指针作为函数参数。

无可否认,引用变量比指针更容易处理,因为引用变量隐藏了所有的解引用和间接引用"机制"。

但是,程序员仍然应该学会使用指针作为函数参数,因为有一些任务,特别是在处理 C 字符串时,最好使用指针完成、另外,C++ 库中还有许多使用指针作为形参的函数。

以下是使用指针形参的函数的定义:void doubleValue(int *val){*val *= 2;}这个函数的目的是使 val 指向的变量翻倍。

当 val 被解引用时,*= 运算符对 val 指向的变量起作用。

该语句可以将地址存储在 val 中的原始变量乘以 2。

当然,当调用该函数时,必须使用被翻倍的变量地址作为实参,而不是变量本身作为实参。

以下是一个调用 doubleValue 函数的示例:doubleValue(&number);该语句使用了地址运算符(&)将 number 的地址传递到 val 形参中。

函数执行后,number 的内容将被乘以 2。

下面的程序演示了该函数的用法://This program uses two functions that accept addresses of variables as arguments.#include <iostream>using namespace std;//Function prototypesvoid getNumber(int *);void doubleValue(int *);int main(){int number;//Call getNumber and pass the address of numbergetNumber(&number);// Call doubleValue and pass the address of number doubleValue(&number);// Display the value in numbercout << "That value doubled is " << number << endl; return 0;}void getNumber(int *input){cout << "Enter an integer number: ";cin >> *input;}void doubleValue(int *val){*val *= 2;}程序输出结果:Enter an integer number: 10That value doubled is 20此程序有两个使用指针作为参数的函数。

数组、指针和函数综合编程练习

数组、指针和函数综合编程练习

实验十:数组、指针和函数综合编程练习一:实验目的:–1.掌握指针变量的定义和使用–2.指针变量作为函数参数的实际意义。

–3.体会数组名作为函数参数与指针变量作为函数参数的区别。

二:实验内容及要求:1 打印最高分和学号假设每班人数最多不超过40人,具体人数由键盘输入,用一维数组和指针变量作为函数参数,编程打印某班一门课成绩的最高分及其学号。

2 字符串拷贝分别用字符数组和字符指针编程实现字符串拷贝。

三:程序源代码:题目1:#include <stdio.h>#define ARR_SIZE 40void Findmax(int score[],long num[],int n,int *pmaxScore,long *pmaxNum);main(){int i,n;int score[ARR_SIZE],maxScore;long num[ARR_SIZE],maxNum;printf("Please enter total number:");scanf("%d",&n);printf("Please enter the number and score:\n");for(i=0;i<n;i++){scanf("%ld%d",&num[i],&score[i]);}Findmax(score,num,n,&maxScore,&maxNum);printf("maxScore=%d,maxNum=%06ld\n",maxScore,maxNum);}void Findmax(int score[],long num[],int n,int *pmaxScore,long *pmaxNum){int i;*pmaxScore=score[0];*pmaxNum=num[0];for(i=0;i<n;i++){if(score[i]>*pmaxScore){*pmaxScore=score[i];*pmaxNum=num[i];}}}题目2:#include <stdio.h>void Mystrcpy(char *dstStr,const char *srcStr); main(){char dstStr[80],srcStr[80];printf("Please enter a string:");scanf("%s",srcStr);Mystrcpy(&dstStr,&srcStr);printf("The copy is:%s\n",dstStr);}void Mystrcpy(char *dstStr,const char *srcStr) {while(*srcStr!='\0'){*dstStr=*srcStr;dstStr++;srcStr++;}dstStr='\0';}四:运行结果、分析与讨论:题目1:Please enter total number:5 Please enter the number and score: 00001 8500002 6500003 9800004 8700005 45maxScore=98,maxNum=000003 Press any key to continue... 在程序需要多个返回变量值时,return因无法实现其目的而显现出它的劣势,而通过使用指针变量来实现对存储地址内的内容的交换,并返回相应的值是很好的选择。

指针函数实验报告

指针函数实验报告

一、实验目的1. 理解指针函数的概念及其在C语言中的作用。

2. 掌握指针函数的定义、声明和调用方法。

3. 学会通过指针函数实现参数的传递和数据的修改。

4. 熟悉指针函数在实际编程中的应用。

二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C语言三、实验内容本次实验主要围绕指针函数展开,具体包括以下内容:1. 指针函数的定义和声明2. 指针函数的调用方法3. 指针函数的应用实例4. 指针函数与数组、字符串的关联四、实验步骤1. 指针函数的定义和声明指针函数的定义格式如下:```c返回类型 (函数名)(参数类型参数名);```其中,返回类型表示函数返回值的类型,函数名表示函数的名称,参数类型和参数名表示函数的参数类型和名称。

例如,以下是一个简单的指针函数定义:```cint getMax(int a, int b) {return a > b ? a : b;}```该函数的功能是比较两个整数指针所指向的值,并返回较大的值。

2. 指针函数的调用方法调用指针函数时,需要将参数传递给函数,并在函数内部通过指针操作实现对数据的访问和修改。

例如,以下代码展示了如何调用上述 `getMax` 函数:```cint main() {int a = 5, b = 10;int max = getMax(&a, &b);printf("The max value is: %d\n", max);return 0;}```在上述代码中,`getMax` 函数通过指针参数 `a` 和 `b` 访问传入的整数,并返回较大的值。

3. 指针函数的应用实例下面通过几个实例展示指针函数在实际编程中的应用。

实例1:计算数组中元素的平均值```cdouble getAverage(int arr, int n) {int sum = 0;for (int i = 0; i < n; ++i) {sum += (arr + i);}return (double)sum / n;}```实例2:交换两个整数的值```cvoid swap(int a, int b) {int temp = a;a = b;b = temp;}```实例3:字符串复制```cvoid strcpy(char dest, const char src) { while (src) {dest++ = src++;}dest = '\0';}```4. 指针函数与数组、字符串的关联指针函数在处理数组和字符串时非常有用。

指针作函数参数

指针作函数参数

指针作函数参数指针作为函数参数是C语言中非常重要的一个概念,它可以用于实现函数之间的数据传递与共享。

本文将对指针作为函数参数的概念、使用方法以及相关注意事项进行详细介绍。

在C语言中,指针是一种变量类型,它存储了一个内存地址的值。

通过指针,我们可以访问或修改一些内存地址中存储的值。

当指针作为函数参数时,实际上传递的是指针所指向的内存地址而不是它所存储的值。

指针作为函数参数的最大优势之一是可以实现对函数外部数据的修改。

当我们将一个变量的指针作为函数参数传递给一个函数时,该函数可以通过对指针进行操作来修改这个变量的值。

这种更改是直接反映到函数外部的,因为传递的实际上是变量在内存中的地址。

另一个使用指针作为函数参数的常见情况是在函数中动态分配内存。

通过传递指向指针的指针,函数可以分配并返回动态分配的内存,并确保在函数调用结束后内存不会丢失。

这种方法在动态数据结构中特别有用,例如链表、树等。

为了更好地理解指针作为函数参数的使用方法,我们将通过一个简单的示例来说明。

假设我们要编写一个函数,用于将两个整数相加并将结果存储在第三个参数所指向的内存空间中。

```c// 定义函数,其中x和y是要相加的两个数,result是存储结果的指针void add(int x, int y, int* result)*result = x + y;int maiint a = 5, b = 3, c;//调用函数,并将c的指针传递给函数add(a, b, &c);//输出计算结果printf("%d + %d = %d\n", a, b, c);return 0;```在上述示例中,我们通过传递指向c的指针来将结果返回给调用函数。

通过在函数中对指针进行解引用,我们可以将计算结果存储在c所指向的内存地址中。

这样,在函数调用结束后,我们可以直接访问并打印出结果。

当使用指针作为函数参数时,需要注意一些重要的事项。

指针作为函数参数返回值

指针作为函数参数返回值

指针作为函数参数返回值在C语言中,指针是一种非常重要的数据类型,可以用来操作内存中的数据。

指针可以作为函数参数传递,也可以作为函数的返回值。

本文将着重讨论指针作为函数参数返回值的情况。

指针作为函数参数在 C 语言中,函数可以接受指针作为参数。

这样函数就可以直接操作指针所指向的内存,而不需要将整个数据结构复制到函数中。

例如,我们可以定义一个函数来交换两个整数的值:```cvoid swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}```在这个函数中,a 和 b 都是指向整数的指针。

我们通过解引用操作符 * 来访问指针所指向的值,并将它们交换。

现在我们可以调用 swap 函数来交换两个整数的值:```cint x = 10;int y = 20;swap(&x, &y);// 现在 x 的值是 20,y 的值是 10```在调用 swap 函数时,我们传递了 x 和 y 的地址作为参数。

函数内部通过指针来访问这些值,并交换它们的值。

指针作为函数返回值在 C 语言中,函数可以返回指针类型的值。

这样函数就可以返回指向内存中某个位置的指针,以便调用者可以访问该位置的数据。

例如,我们可以定义一个函数来创建一个动态分配的整数数组:```cint *create_array(int size) {int *arr = malloc(size * sizeof(int));return arr;}```在这个函数中,我们使用了 malloc 函数来动态分配一个整数数组。

malloc 函数返回一个指向新分配内存的指针。

我们将这个指针作为函数的返回值,以便调用者可以访问这个数组。

现在我们可以调用 create_array 函数来创建一个整数数组: ```cint *arr = create_array(10);// 现在可以使用 arr 这个指针来访问新分配的数组```在调用 create_array 函数时,我们传递了数组的大小作为参数。

指针作为函数参数

指针作为函数参数

C语言程序设计
{
int a = 3, b = 4;
swap(&a, &b);
printf("return to main:a=%d,b=%d\n", a, b);
}
指针作为函数参数(续)
❖ 程序执行过程 ▪ 参数传递
• 实参分别是&a和&b,相应的形参px和py也被定义为int* 类型
main
a
3 1000
b
4 1004
程序执行后输出结果为: in swap:*px=4,*py=3
{ int temp;
return to main:a=4,b=3
temp = *px;
*px = *py;
*py = temp;
printf("in swap:*px=%d,*py=%d\n", *px, *py);
}
void main()
x = y;
y = temp;
printf("in swap:x=%d,y=%d\n", x, y);
}
void main()
{
int a = 3, b = 4;
swap(a, b);
printf("return to main:a=%d,b=%d\n", a, b);
}
指针作为函数参数(续)
❖ 程序执行过程 ▪ 参数传递
▪ 返回main函数
main
a
4 1000
b
3 1004
swap px xxx py xxx
2000 2004
temp xxx 2010
指针作为函数参数(续)

实验10指针做函数参数编程训练

实验10指针做函数参数编程训练

实验10指针做函数参数编程训练实验10指针做函数参数编程训练实验目的:1.掌握指针的定义及使用;2.体会使用指针的作用;3.掌握指针做函数参数的作用;4.掌握指针做函数参数的基本步骤;实验题目:1.输入某年某月某日,计算并输出它是这一年的第几天。

/*函数功能:对给定的某年某月某日,计算它是这一年第几天函数参数:整型变量year,month,day,分别代表年,月,日函数返回值:这一年的第几天*/int DayofYear(int year,int month,int day);2.输入某一年的第几天,计算并输出它是这一年的第几月第几日。

/*函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日函数入口参数:整型变量year,存储年整型变量yearDay,存储这一年的第几天函数出口参数:整型指针pMonth,指向存储这一年第几月的整型变量整型指针pDay,指向存储第几日的整型变量函数返回值:无*/void MonthDay(int year,int yearDay,int *pMonth,int *pDay);3.输出如下菜单,用switch语句实现根据用户输入的选择执行相应的操作。

1.year/month/day->yearDay2.yearDay->year/month/day3.ExitPlease enter your choice:参考程序及注释:#include#includeint DayofYear(int year, int month, int day);void MonthDay(int year, int yearDay, int *pMonth, int *pDay); void Menu(void);int dayTab[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}};int main(){int year, month, day, yearDay;char c;Menu(); /* 调用Menu函数显示一个固定式菜单*/c = getchar(); /* 输入选择*/switch (c) /* 判断选择的是何种操作*/{case '1':printf("Please enter year, month, day:");scanf("%d,%d,%d", &year, &month, &day);yearDay = DayofYear(year, month, day);printf("yearDay = %d\n", yearDay);break;case '2':printf("Please enter year, yearDay:");scanf("%d,%d", &year, &yearDay);MonthDay(year, yearDay, &month, &day);printf("month = %d, day = %d\n", month, day);break;case '3':exit(0); /* 退出程序的运行*/default:printf("Input error!");}return 0;}/* 函数功能:对给定的某年某月某日,计算并返回它是这一年的第几天*/int DayofYear(int year, int month, int day){int i, leap;/* 若year为闰年,即leap值为1,则用第1行元素dayTab[1][i]计算;否则leap值为0,用第0行dayTab[0][i]计算*/leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);for (i=1; i<="" p="">{day = day + dayTab[leap][i];}return day; /* 返回计算出的day的值*/}/* 函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日*/ void MonthDay(int year, int yearDay, int *pMonth, int *pDay){int i, leap;leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);for (i=1; yearDay>dayTab[leap][i]; i++){yearDay = yearDay - dayTab[leap][i];}*pMonth = i; /* 将计算出的月份值赋值给pMonth所指向的变量*/ *pDay = yearDay; /* 将计算出的日号赋值给pDay所指向的变量*/ }/* 函数功能:显示菜单*/void Menu(void){printf("1. year/month/day -> yearDay\n");printf("2. yearDay -> year/month/day\n");printf("3. Exit\n");printf("Please enter your choice:");}实验11 字符串与指针编程练习实验目的:1.熟悉字符串的输入及输出2.掌握字符指针做函数参数的方法3.掌握数组做函数参数的方法实验题目:1.编写一函数实现字符串的反序输出,函数原型如下:void invert(char *s);即将字符串s反序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验10指针做函数参数编程训练实验目的:1.掌握指针的定义及使用;2.体会使用指针的作用;3.掌握指针做函数参数的作用;4.掌握指针做函数参数的基本步骤;实验题目:1.输入某年某月某日,计算并输出它是这一年的第几天。

/*函数功能:对给定的某年某月某日,计算它是这一年第几天函数参数:整型变量year,month,day,分别代表年,月,日函数返回值:这一年的第几天*/int DayofYear(int year,int month,int day);2.输入某一年的第几天,计算并输出它是这一年的第几月第几日。

/*函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日函数入口参数:整型变量year,存储年整型变量yearDay,存储这一年的第几天函数出口参数:整型指针pMonth,指向存储这一年第几月的整型变量整型指针pDay,指向存储第几日的整型变量函数返回值:无*/void MonthDay(int year,int yearDay,int *pMonth,int *pDay);3.输出如下菜单,用switch语句实现根据用户输入的选择执行相应的操作。

1.year/month/day->yearDay2.yearDay->year/month/day3.ExitPlease enter your choice:参考程序及注释:#include <stdio.h>#include <stdlib.h>int DayofYear(int year, int month, int day);void MonthDay(int year, int yearDay, int *pMonth, int *pDay);void Menu(void);int dayTab[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}};int main(){int year, month, day, yearDay;char c;Menu(); /* 调用Menu函数显示一个固定式菜单 */c = getchar(); /* 输入选择 */switch (c) /* 判断选择的是何种操作 */{case '1':printf("Please enter year, month, day:");scanf("%d,%d,%d", &year, &month, &day);yearDay = DayofYear(year, month, day);printf("yearDay = %d\n", yearDay);break;case '2':printf("Please enter year, yearDay:");scanf("%d,%d", &year, &yearDay);MonthDay(year, yearDay, &month, &day);printf("month = %d, day = %d\n", month, day);break;case '3':exit(0); /* 退出程序的运行 */default:printf("Input error!");}return 0;}/* 函数功能:对给定的某年某月某日,计算并返回它是这一年的第几天 */int DayofYear(int year, int month, int day){int i, leap;/* 若year为闰年,即leap值为1,则用第1行元素dayTab[1][i]计算;否则leap值为0,用第0行dayTab[0][i]计算 */leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);for (i=1; i<month; i++){day = day + dayTab[leap][i];}return day; /* 返回计算出的day的值 */}/* 函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日 */ void MonthDay(int year, int yearDay, int *pMonth, int *pDay){int i, leap;leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);for (i=1; yearDay>dayTab[leap][i]; i++){yearDay = yearDay - dayTab[leap][i];}*pMonth = i; /* 将计算出的月份值赋值给pMonth所指向的变量 */ *pDay = yearDay; /* 将计算出的日号赋值给pDay所指向的变量 */}/* 函数功能:显示菜单 */void Menu(void){printf("1. year/month/day -> yearDay\n");printf("2. yearDay -> year/month/day\n");printf("3. Exit\n");printf("Please enter your choice:");}实验11 字符串与指针编程练习实验目的:1.熟悉字符串的输入及输出2.掌握字符指针做函数参数的方法3.掌握数组做函数参数的方法实验题目:1.编写一函数实现字符串的反序输出,函数原型如下:void invert(char *s);即将字符串s反序。

解题思路:用循环将串s的首尾字符对调,直到中间位置结束。

如:串“ABCDE\0”,将A与E对调(交换),B与D对调,循环次数是串的实际长度的一半。

2.在主函数main中输入一串字符串,并调用invert函数将此字符串反序,然后再将反序后的字符串输出。

3.编写一函数将字符串s中的字符c删除void charDel(char *s,char c);解题思路:假设s为“aebefe\0”串中的e字符删除,判断当前s指针是否指向e字符,若指向e字符,则将e字符后面的befe\0字符向前移动一位,然后移动s指针,重复这一过程。

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

解题思路:如果当前s指针指向的是c1字符,则把c2赋值给s指针所指向的地址空间,然后移动指针s,重复上述过程。

参考代码:#include "stdio.h"#include "string.h"void replace(char *s,char c1,char c2);void charDel(char *s,char c);void invert(char *s);int main(){char str[]="acbd";invert(str);puts(str);}void invert(char *s){int strLenth;char *i,*j,*mid,temp;//j和i所指向字符是相互交换的字符strLenth=strlen(s);mid=s+strLenth/2;//交换的次数应为字符串总长度除以2j=s+strLenth-1;//令j指向字符串的末尾,\0字符的前一个字符for(i=s;i<mid;i++)//i=s令i指针指向字符串的首部,i++令i指针指向下一个字符{temp=*i;*i=*j;*j=temp;//交换对应的字符j--;//字符串末尾指向前移}}void charDel(char *s,char c){char *p,*q;while(*s!='\0'){if(*s==c){p=s;q=s+1;while(*p++=*q++);//要删除的字符后面的字符串整体向前移动一位,也可以用下面的这段代码/*while(*p!='\0'){*p=*q;p++;q++;}*q='\0';*/}s++;}}void replace(char *s,char c1,char c2){while(*s!='\0'){if(*s==c1){*s=c2;s++;}}}(注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。

可复制、编制,期待你的好评与关注)。

相关文档
最新文档