十万火急,关于函数中形参为数组的问题

作者&投稿:冉泄 (若有异议请与网页底部的电邮联系)
C语言中函数定义形参为数组时的问题~

1.数组为参数传递的是数组首地址,而不是元素的值,而你说的a[size]仅仅是值,况且事实上也没有a[size]这个元素
2.既然是数组名的传递,当然需要由一个数组的参数来接收,int v[]”的问题是因为他是形式参数,是为了接收数组的
n的问题是因为,如果只传递了数组,但是函数并找不到数组的个数,所以需要把数组大小传递过来

1、新建一个数组作为参数项目,如图所示:

2、添加一个array.c文件,如图所示:

3、包含stdio.h和stdlib.h头文件,如图所示:

4、输入main函数主体及返回值,如图所示:

5、定义一个数组arr,如图所示:

6、定义一个function函数,如图所示:

7、将数组作为参数传递给function函数,如图所示:

8、运行程序,输出结果,如图所示:

之所以会发生错误,是因为你没有弄清楚参数传递的机制,即传值调用不改变原参数的值。

如果你的函数参数为(int *, int)时,当你调用create(a,len)时,系统会将数组a的起始地址的值(注:此时此值为NULL,不过此值为何并无影响,下面解释)压入参数栈。之后程序跳入create函数开始执行。

此时,系统创建了一个int *类型的临时变量,我们不妨就称其为ap。然后,系统从参数栈中找到压入的参数值(即前面提到的NULL值),并将其赋给ap。

也就是说,指针ap此时可以看做和传入的指针具有相同的值,即临时变量ap指向传入的数组的开头(其实也就是ap = NULL)。

之后,系统执行ap = new int[n]语句,在内存中申请一块新的区域,并将它的起始地址再次赋给ap。在执行这一步操作后,原始指针a的值并未改变!被改变的仅仅是临时指针变量ap的值!

之后系统退出create函数,临时变量ap被销毁!而原始指针变量a的值依然为NULL!

而你将参数表改为(int *&,int),则是利用了C++中的语法糖:引用。加入&号后,引用机制将使得传入的参数被自动取地址,这样就实现了传址调用。

这样,你在调用create(a,len)时,系统将指向数组a的指针的本身的地址压入参数栈,进入create函数后,系统将会隐性的创建一个临时变量(不妨称其为app),使他的值等于压入的地址。在执行ap = new int[n]这个语句时,引用机制隐性的完成了 *(app) = new int[n]这步取值赋值操作,由于app是指向数组a的指针的指针,这样就实际的改变了指针a的值,使其指向一块有意义的内存空间。

void create(int *ap,int n)
int型指针变量ap为形参,当a作为实参传递进来后它本身的值是不能修改的,也就是说函数执行完后a还是指向NULL
void create(int *&ap,int n)
这是引用的用法,引用是可以修改实参本身的值的

int *&,int,目前我还没发现吧指针和引用如此用的,*&,你要么在声明时候直接用&,要门就在main函数里面再转换成&,不过你改成&后,。函数内部的指针类都要改成引用

你可以参考该程序,tc2.0下通过,源自《C语言课程设计案例精编》;
/******头文件(.h)***********/
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*标准库函数*/
#include "string.h"/*字符串函数*/
#include "ctype.h" /*字符操作函数*/
#define M 50 /*定义常数表示记录数*/
typedef struct /*定义数据结构*/
{
char name[20]; /*姓名*/
char units[30]; /*单位*/
char tele[10]; /*电话*/
}ADDRESS;
/******以下是函数原型*******/
int enter(ADDRESS t[]); /*输入记录*/
void list(ADDRESS t[],int n); /*显示记录*/
void search(ADDRESS t[],int n); /*按姓名查找显示记录*/
int delete(ADDRESS t[],int n); /*删除记录*/
int add(ADDRESS t[],int n); /*插入记录*/
void save(ADDRESS t[],int n); /*记录保存为文件*/
int load(ADDRESS t[]); /*从文件中读记录*/
void display(ADDRESS t[]); /*按序号查找显示记录*/
void sort(ADDRESS t[],int n); /*按姓名排序*/
void qseek(ADDRESS t[],int n); /*快速查找记录*/
void copy(); /*文件复制*/
void print(ADDRESS temp); /*显示单条记录*/
int find(ADDRESS t[],int n,char *s) ; /*查找函数*/
int menu_select(); /*主菜单函数*/
/******主函数开始*******/
main()
{
int i;
ADDRESS adr[M]; /*定义结构体数组*/
int length; /*保存记录长度*/
clrscr(); /*清屏*/
for(;;)/*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{
case 0:length=enter(adr);break;/*输入记录*/
case 1:list(adr,length);break; /*显示全部记录*/
case 2:search(adr,length);break; /*查找记录*/
case 3:length=delete(adr,length);break; /*删除记录*/
case 4:length=add(adr,length); break; /*插入记录*/
case 5:save(adr,length);break; /*保存文件*/
case 6:length=load(adr); break; /*读文件*/
case 7:display(adr);break; /*按序号显示记录*/
case 8:sort(adr,length);break; /*按姓名排序*/
case 9:qseek(adr,length);break; /*快速查找记录*/
case 10:copy();break; /*复制文件*/
case 11:exit(0); /*如返回值为11则程序结束*/
}
}
}
/*菜单函数,函数返回值为整数,代表所选的菜单项*/
menu_select()
{
char s[80];
int c;
gotoxy(1,25);/*将光标定为在第25行,第1列*/
printf("press any key enter menu......\n");/*提示压任意键继续*/
getch(); /*读入任意字符*/
clrscr(); /*清屏*/
gotoxy(1,1);
printf("********************MENU*********************\n\n");
printf(" 0. Enter record\n");
printf(" 1. List the file\n");
printf(" 2. Search record on name\n");
printf(" 3. Delete a record\n");
printf(" 4. add record \n");
printf(" 5. Save the file\n");
printf(" 6. Load the file\n");
printf(" 7. display record on order\n");
printf(" 8. sort to make new file\n");
printf(" 9. Quick seek record\n");
printf(" 10. copy the file to new file\n");
printf(" 11. Quit\n");
printf("***********************************************\n");
do{
printf("\n Enter you choice(0~11):"); /*提示输入选项*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整型数*/
}while(c<0||c>11); /*选择项不在0~11之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/
int enter(ADDRESS t[])
{
int i,n;
char *s;
clrscr(); /*清屏*/
printf("\nplease input num \n"); /*提示信息*/
scanf("%d",&n); /*输入记录数*/
printf("please input record \n"); /*提示输入记录*/
printf("name unit telephone\n");
printf("------------------------------------------------\n");
for(i=0;i<n;i++)
{
scanf("%s%s%s",t[i].name,t[i].units,t[i].tele); /*输入记录*/
printf("----------------------------------------------\n");
}
return n; /*返回记录条数*/
}
/*显示记录,参数为记录数组和记录条数*/
void list(ADDRESS t[],int n)
{
int i;
clrscr();
printf("\n\n*******************ADDRESS******************\n");
printf("name unit telephone\n");
printf("------------------------------------------------\n");
for(i=0;i<n;i++)
printf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);
if((i+1)%10==0) /*判断输出是否达到10条记录*/
{
printf("Press any key continue...\n"); /*提示信息*/
getch(); /*压任意键继续*/
}
printf("************************end*******************\n");
}
/*查找记录*/
void search(ADDRESS t[],int n)
{
char s[20]; /*保存待查找姓名字符串*/
int i; /*保存查找到结点的序号*/
clrscr(); /*清屏*/
printf("please search name\n");
scanf("%s",s); /*输入待查找姓名*/
i=find(t,n,s); /*调用find函数,得到一个整数*/
if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
printf("not found\n");
else
print(t[i]); /*找到,调用显示函数显示记录*/
}
/*显示指定的一条记录*/
void print(ADDRESS temp)
{
clrscr();
printf("\n\n********************************************\n");
printf("name unit telephone\n");
printf("------------------------------------------------\n");
printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);
printf("**********************end***********************\n");
}
/*查找函数,参数为记录数组和记录条数以及姓名s */
int find(ADDRESS t[],int n,char *s)
{
int i;
for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/
{
if(strcmp(s,t[i].name)==0) /*记录中的姓名和待比较的姓名是否相等*/
return i; /*相等,则返回该记录的下标号,程序提前结结束*/
}
return i; /*返回i值*/
}
/*删除函数,参数为记录数组和记录条数*/
int delete(ADDRESS t[],int n)
{
char s[20]; /*要删除记录的姓名*/
int ch=0;
int i,j;
printf("please deleted name\n"); /*提示信息*/
scanf("%s",s);/*输入姓名*/
i=find(t,n,s); /*调用find函数*/
if(i>n-1) /*如果i>n-1超过了数组的长度*/
printf("no found not deleted\n"); /*显示没找到要删除的记录*/
else
{
print(t[i]); /*调用输出函数显示该条记录信息*/
printf("Are you sure delete it(1/0)\n"); /*确认是否要删除*/
scanf("%d",&ch); /*输入一个整数0或1*/
if(ch==1) /*如果确认删除整数为1*/
{
for(j=i+1;j<n;j++) /*删除该记录,实际后续记录前移*/
{
strcpy(t[j-1].name,t[j].name); /*将后一条记录的姓名拷贝到前一条*/
strcpy(t[j-1].units,t[j].units); /*将后一条记录的单位拷贝到前一条*/
strcpy(t[j-1].tele,t[j].tele); /*将后一条记录的电话拷贝到前一条*/
}
n--; /*记录数减1*/
}
}
return n; /*返回记录数*/
}
/*插入记录函数,参数为结构体数组和记录数*/
int add(ADDRESS t[],int n)/*插入函数,参数为结构体数组和记录数*/
{
ADDRESS temp; /*新插入记录信息*/
int i,j;
char s[20]; /*确定插入在哪个记录之前*/
printf("please input record\n");
printf("************************************************\n");
printf("name unit telephone\n");
printf("--------------------------------------------------\n");
scanf("%s%s%s",temp.name,temp.units,temp.tele); /*输入插入信息*/
printf("------------------------------------------------\n");
printf("please input locate name \n");
scanf("%s",s); /*输入插入位置的姓名*/
i=find(t,n,s); /*调用find,确定插入位置*/
for(j=n-1;j>=i;j--) /*从最后一个结点开始向后移动一条*/
{
strcpy(t[j+1].name,t[j].name); /*当前记录的姓名拷贝到后一条*/
strcpy(t[j+1].units,t[j].units); /*当前记录的单位拷贝到后一条*/
strcpy(t[j+1].tele,t[j].tele); /*当前记录的电话拷贝到后一条*/
}
strcpy(t[i].name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/
strcpy(t[i].units,temp.units); /*将新插入记录的单位拷贝到第i个位置*/
strcpy(t[i].tele,temp.tele); /*将新插入记录的电话拷贝到第i个位置*/
n++; /*记录数加1*/
return n; /*返回记录数*/
}
/*保存函数,参数为结构体数组和记录数*/
void save(ADDRESS t[],int n)
{
int i;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record.txt","wb"))==NULL) /*打开文件,并判断打开是否正常*/
{
printf("can not open file\n");/*没打开*/
exit(1); /*退出*/
}
printf("\nSaving file\n"); /*输出提示信息*/
fprintf(fp,"%d",n); /*将记录数写入文件*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
for(i=0;i<n;i++)
{
fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele);/*格式写入记录*/
fprintf(fp,"\r\n"); /*将换行符号写入文件*/
}
fclose(fp);/*关闭文件*/
printf("****save success***\n"); /*显示保存成功*/
}
/*读入函数,参数为结构体数组*/
int load(ADDRESS t[])
{
int i,n;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/
{
printf("can not open file\n"); /*不能打开*/
exit(1); /*退出*/
}
fscanf(fp,"%d",&n); /*读入记录数*/
for(i=0;i<n;i++)
fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele); /*按格式读入记录*/
fclose(fp); /*关闭文件*/
printf("You have success read data from file!!!\n"); /*显示保存成功*/
return n; /*返回记录数*/
}
/*按序号显示记录函数*/
void display(ADDRESS t[])
{
int id,n;
FILE *fp; /*指向文件的指针*/
if((fp=fopen("record.txt","rb"))==NULL) /*打开文件*/
{
printf("can not open file\n"); /*不能打开文件*/
exit(1); /*退出*/
}
printf("Enter order number...\n"); /*显示信息*/
scanf("%d",&id); /*输入序号*/
fscanf(fp,"%d",&n); /*从文件读入记录数*/
if(id>=0&&id<n) /*判断序号是否在记录范围内*/
{
fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移动文件指针到该记录位置*/
print(t[id]); /*调用输出函数显示该记录*/
printf("\r\n");
}
else
printf("no %d number record!!!\n ",id); /*如果序号不合理显示信息*/
fclose(fp); /*关闭文件*/
}
/*排序函数,参数为结构体数组和记录数*/
void sort(ADDRESS t[],int n)
{
int i,j,flag;
ADDRESS temp; /*临时变量做交换数据用*/
for(i=0;i<n;i++)
{
flag=0; /*设标志判断是否发生过交换*/
for(j=0;j<n-1;j++)
if((strcmp(t[j].name,t[j+1].name))>0) /*比较大小*/
{
flag=1;
strcpy(temp.name,t[j].name); /*交换记录*/
strcpy(temp.units,t[j].units);
strcpy(temp.tele,t[j].tele);
strcpy(t[j].name,t[j+1].name);
strcpy(t[j].units,t[j+1].units);
strcpy(t[j].tele,t[j+1].tele);
strcpy(t[j+1].name,temp.name);
strcpy(t[j+1].units,temp.units);
strcpy(t[j+1].tele,temp.tele);
}
if(flag==0)break; /*如果标志为0,说明没有发生过交换循环结束*/
}
printf("sort sucess!!!\n"); /*显示排序成功*/
}
/*快速查找,参数为结构体数组和记录数*/
void qseek(ADDRESS t[],int n)
{
char s[20];
int l,r,m;
printf("\nPlease sort before qseek!\n"); /*提示确认在查找之前,记录是否已排序*/
printf("please enter name for qseek\n"); /*提示输入*/
scanf("%s",s); /*输入待查找的姓名*/
l=0;r=n-1; /*设置左边界与右边界的初值*/
while(l<=r) /*当左边界<=右边界时*/
{
m=(l+r)/2; /*计算中间位置*/
if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/
{
print(t[m]); /*如果相等,则调用print函数显示记录信息*/
return ; /*返回*/
}
if(strcmp(t[m].name,s)<0) /*如果中间结点小*/
l=m+1; /*修改左边界*/
else
r=m-1; /*否则,中间结点大,修改右边界*/
}
if(l>r) /*如果左边界大于右边界时*/
printf("not found\n"); /*显示没找到*/
}
/*复制文件*/
void copy()
{
char outfile[20]; /*目标文件名*/
int i,n;
ADDRESS temp[M]; /*定义临时变量*/
FILE *sfp,*tfp; /*定义指向文件的指针*/
clrscr();/*清屏*/
if((sfp=fopen("record.txt","rb"))==NULL) /*打开记录文件*/
{
printf("can not open file\n"); /*显示不能打开文件信息*/
exit(1); /*退出*/
}
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示信息*/
scanf("%s",outfile); /*输入目标文件名*/
if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/
{
printf("can not open file\n"); /*显示不能打开文件信息*/
exit(1); /*退出*/
}
fscanf(sfp,"%d",&n); /*读出文件记录数*/
fprintf(tfp,"%d",n);/*写入目标文件数*/
fprintf(tfp,"\r\n"); /*写入换行符*/
for(i=0;i<n;i++)
{
fscanf(sfp,"%20s%30s%10s\n",temp[i].name,temp[i].units,
temp[i].tele); /*读入记录*/
fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,
temp[i].units,temp[i].tele); /*写入记录*/
fprintf(tfp,"\r\n"); /*写入换行符*/
}
fclose(sfp); /*关闭源文件*/
fclose(tfp); /*关闭目标文件*/
printf("you have success copy file!!!\n"); /*显示复制成功*/
}


十万火急高3反函数求法
根号下(x-x)2吗 还是根号下 X-X2 啊 就是 把 X=根号下的哪个式子 代如你所求的式子中

excel 函数 高手无敌的就来看看吧 急啊 十万火急 啊 无敌的 高手在哪里...
E1里面自己判断下 E2公式 =if(B2=2,sumif(B$1:B2,1,A$1:A2)-sum(E$1:E1),"")向下填充

十万火急:一个不等式问题
所以也就是说,对于任意的实数p<2,我们总可以取足够大的n,使左边除以右边小于1,即左边小于右边。所以p<2时,这个不等式不成立。p=2时成立,不说了。p>2时,上式左边关于p是一个单调递增的函数,而右边不含p,因为p=2时成立,所以当p更大时更成立了。至此,我们证明了我们的结论:这个不...

高一函数单调性问题。十万火急!!!
两边都是绝对值可以先平方 <==>1+2m+m^2<4m^2 <==> 3m^2-2m-1>0 <==> (3m+1)(m-1)>0 <==> m<-1\/3 或m>1

【十万火急】如何用微分方程解出函数
f''就是表示f的二阶导数,你的理解是正确的,就是f求了一次导数后再次求导。从这些题目来看,你需要知道简单的一些常用函数的求导,祝你成功!

初二数学题,十万火急呀
1.每分钟进水20÷4=5升、2.y与x的函数关系式是y=kx+b,把(0,0)(4,20)代入得 {b=020=4k+0 ∴k=5,b=0 ∴y与x的函数关系式是y=5x(0≤x≤4)3.设y与x的函数关系式是y=kx+b,把(4,20)(12,30)代入得 {20=4k+b 30=12k+b ∴k= 5\/4,b=15 ∴y与x的函数...

十万火急!!求一条累加公式的结果,求过程或者代码都可以。循环逻辑也可...
如何求一条累加公式的结果?该问题可以这样实现:第一步,将已知数据分别赋值给B,PBoi,Boo 第二步,利用两次sum函数,计算∑∑Pi*B*Pi 第三步,利用sum函数,计算∑Boi*Pi 第四步,计算∑∑Pi*B*Pi+∑Boi*Pi时,还得考虑线路损耗率,这样才能得到线路损耗功率Ploos 第五步,完善计算过程,得到...

关于数学的四字词语。
一心一意、一分为二、不三不四(三心二意)、四面八方、四通八达、 五光十色(五颜六色)、六神无主、七零八落(七上八下)、五花八门、半斤八两、九牛一毛、九死一生、九牛二虎之力 (2)十全十美(十万火急)、百花齐放(百家争鸣)、千军万马(千载难逢)、万紫千红(万水千山)一目...

下列函数中既是奇函数又是单调增加函数的是 sin的立方x x的立方+1...
有界函数

一道数学求方程隐函数的导数!!十万火急
(1)x^3+y^3=a^3,微分得3x^2dx+3y^2dy=0,所以dy\/dx=-x^2\/y^2.(2)y+xcosy=1,微分得dy+cosydx-xsinydy=0,整理得cosydx=(xsiny-1)dy,所以dy\/dx=cosy\/(xsiny-1).

带岭区18451862435: C语言中函数定义形参为数组时的问题 -
聊鸣盐酸: 1.数组为参数传递的是数组首地址,而不是元素的值,而你说的a[size]仅仅是值,况且事实上也没有a[size]这个元素 2.既然是数组名的传递,当然需要由一个数组的参数来接收,int v[]”的问题是因为他是形式参数,是为了接收数组的 n的问题是因为,如果只传递了数组,但是函数并找不到数组的个数,所以需要把数组大小传递过来

带岭区18451862435: 形参是数组的时候,函数声明的形参可不可以只写数组的类型 -
聊鸣盐酸: 不能,一般是在类型后面写中括号 比如下面这个排序函数的声明 int sort(int[],int,int) 函数定义时的函数头是 int sort(int a[],int start,int end)

带岭区18451862435: C语言自定义函数形参为数组名有必要返回值吗? -
聊鸣盐酸: 这要看你设计这个函数是干嘛的了!一般来说,这种数组是按值传值的,它在函数改变了,但一出了这个函数数组的还是没变的,所以如果你需要一个改变后的值,就需要返回一个值了!!如果你是用指针的话,就可以不用了!不过也要看你设计这个函数的目的的哦!!!

带岭区18451862435: 函数形参是数组 但是我想对对作为形参的数组的操作不改变实参数组 -
聊鸣盐酸: 1.保证传递的实参不被改变,因此可以考虑定义局部数组用于返回,但是考虑到程序的健壮性,应该在定义时用const限定 2.只对形参的数组操作,可用一个简单的return 返回,但前提是不能返回动态开辟的内存 因此可以定义为如下形式:ElemType * fun(const ElemType *array)或者其他等同形式 3.很多C语言库函数就是这样定义,如strcpy函数等,但是C语言中并没有const关键字

带岭区18451862435: 定义一个函数,形参是一个数组,要对一个数组进行操作,怎么传参? -
聊鸣盐酸: 不需要传参.函数直接定义为void型(即无类型).在函数中对数组进行操作后,主函数中的数组元素即发生相应改变.

带岭区18451862435: 可以用函数的形参来定义数组的大小吗? -
聊鸣盐酸: 可以, 但没什么意义, 行参指定了大小, 但是实参可以不传递这么大小的数组.它只须知道传递一个数组就行了 那就不可以了, 数组定义时大小必须是个常量,不过你可以这样:char *data = new char[size] ;

带岭区18451862435: c++ 为什么函数的形参可以写成数组的形式,不是说数组不能复制,所以不能用作形参吗? -
聊鸣盐酸: void printvalues(int ff[])在编译后等价于:void printvalues(int *ff); 所以只是复制了一个指针,而不是整个数组.int *ff = arr;

带岭区18451862435: 如何调用一个以数组为形参的函数 -
聊鸣盐酸: 你这个函数写的没有错误.直接调用这个函数就可以了. 例如 >> x = [0:0.1:2]; >> t = y(x) t就是数组了 结果如下:

带岭区18451862435: 关于C语言数组作为函数的实参和形参的问题 -
聊鸣盐酸: 个人觉得, 形参和实参这种叫法让人摸不着头脑 调用子函数时实际上是把数组的首地址传递给子函数, 子函数中的参数score这个变量得到这个地址, 就这么简单

带岭区18451862435: c语言 数组名作为函数的实参时 关于形参的问题
聊鸣盐酸: 因为数组传递的时候,只能是指针传递,或者是用数组名加上[]这个符号

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网