当前位置:首页 » 编程语言 » c语言函数调用参数传递什么意思
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言函数调用参数传递什么意思

发布时间: 2022-09-20 01:59:54

‘壹’ 严老师的数据结构(c语言)中,函数的参数显示传递是什么意思我刚刚学习这本书

1、通过函数的参数显示传递:
A(int a)
{
a = a+2;
}
B(void)
{
int b = 3;
A(b);
}
在函数A中a作为一个参数传入函数中进行运算,那么a就可以算作是A的输入,然后在程序内部a进行了运算后值变了,那么运算后的a又算作是A函数的输出。
2、通过全局变量隐式传递:
全局变量你应该知道吧,简单点说就是作用域涵盖整个程序的变量(当然要看具体情况)。
假设a为int型全局变量,初始值为1:int a = 1;
A()
{
a = a + 2;
}
B()
{
a = a + 3;
}
main()
{
A();

B();
A();
}
通过main函数我们可以看到,程序首先执行的是函数A,那么执行完函数A后全局变量a的值由初始值1变成了3,然后又继续执行函数B,注意此时函数B也是对a进行运算,那么此时全局变量a成了B的输入,运算后a的值为了6,此时a为B的输出。那么也就是说全局变量a在经过A函数的改变后作为一个输入隐式的传入了B函数,然后经过B函数的运算又算作是B的输出。执行过B函数后程序又遇到了A函数,那么此时经过B函数运算的a又作为A函数的一个输入了。

‘贰’ c语言“在调用函数时,主调函数通过参数向被调函数传递数据。”这句话怎么理解

/*
*网络知道
*/
#include<STDIO.H>
voidprint(intnum)
{
printf("%d ",num);
}
voidchange(intnum)
{
num=15;
}
voidtrue_change(int*num)
{
*num=15;
}
intmain(void)
{
intnumber=10;
print(number);//利用函数传值打印
change(number);//试图通过函数改变值但是函数是传值调用不会改变的
print(number);//观察没有改变

true_change(&number);//利用传指针就可以改变
print(number);//果然更改了
return0;
}

你可以去读读《C专家编程》

‘叁’ c语言中参数是什么概念

函数的参数分为形参和实参两种。

形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。

形参和实参的功能是作数据传送,发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

举个例子:

定义一个函数s=f(a,b),功能是将a和b的差赋值给s,那么,a和b就是这个函数的两个参数。

(3)c语言函数调用参数传递什么意思扩展阅读:

C语言的参数传递方式

方法有3种方式:值传递、地址传递、引用传递

tips:

被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放

值传递和地址传递,传递的都是实参的一个拷贝

C语言中实参和形参之间的数据传递是单向的“值传递”,单向传递,只能由实参传给形参,反之不行

输出格式并没有选择%p而是选择了%d,因为十进制的数看起来更直观。

值传递

如果只是传递值的话:

#include <stdio.h>

//值传递传值

void swap( int x, int y);

int main()

{

int a=2,b=3;

printf("before:实参为a,b a=%d,地址为%d b=%d,地址为%d ",a,&a,b,&b);

swap(a,b);

printf("after:实参为a,b a=%d,地址为%d b=%d,地址为%d ",a,&a,b,&b);

return 0;

}

void swap(int x,int y)

{

int tmp;

tmp=x;

x=y;

y=tmp;

printf("inside:形参为x,y x=%d,地址为%d y=%d,地址为%d ",x,&x,y,&y);

}

‘肆’ 在C语言中,函数的形参与实参之间的值传递是什么意思函数调用时如主函数中为swap(a,b),而从函数为

以int 型举例


voidSwap(int*a,int*b)
{
inttemp=*a;
*a=*b;
*b=temp;
}
voidSwap1(inta,intb)
{
inttemp=a;
a=b;
b=temp;

}

Swap(int *, int *);称之为实参 实际传递的是 a和 b 的地址 啊 , 在调用a与b 的值(*a)使用的是原来的数 下面的 x,y; a , b 的值是x与y 的内存地址
swap1(int ,int); 称之为形参 实际传递的是 a 和b 的值,这里的a和b 与xy没关系, 只是x与y 的一个副本。

intswap_test()
{
intx,inty;
x=3;y=5;

Swap(&x,&y);
//此时x=5;y=3;
Swap1(x,y);
//此时x=5;y=3;

return1;
}

‘伍’ 函数参数传递什么意思

这里说的传递当然是指 实参是如何传递给形参的啦
还挺复杂的~~~~~~~~⊙﹏⊙b汗,这里讲述了4种参数传递的情况和注意事项:
1.非引用形参
这是最普通,也是最简单的形参传递了。
参数传递,即是使用实参副本(注意啊,是副本,不是实参本身)来初始化形参;
因此,在函数体内对形参的修改不会影响实参的值。
如果形参是指针类型的,那么函数体内是否可以修改指针所指向的对象的值呢?
如果您产生这样的疑问,表示您很有想法~~~
答案是~~~需要分情况讨论。
如果函数的形参是非const类型的指针,则函数可以通过指针实现赋值,修改指针所指向对象的值。
所以,如果需要保护指针指向的值,则形参需定义为指向const对象的指针(注意了,这里的指针依然是非const型的,只是其指向的对象是const型的):
void use_ptr(const int *p)
{
//use_ptr这个函数可以读指针p所指向的对象,但是不可以修改该对象的值
}
const形参
如果函数使用的是非引用非const形参,则既可以给该它传递const实参,也可传递非const实参。
如果函数使用的是非引用const形参,也是既可以给该它传递const实参,也可传递非const实参。那么这两者的差别是什么呢?对于后者,函数连实参的局部副本都不可以改变了。下面是第二种情况的一个例子: void fcn(const int i) {}
复制实参的局限性:复制实参不是在所有的情况下都适合,不是一复制实参的情况如下:
1.当需要在函数中修改实参的值时
2.当需要以大型对象作为实参传递时。对实际的应用而言,复制对象所付出的时间和存储空间代价往往过大
3.当没有办法实现对象的复制时
对于上述几种情况,有效的解决办法是将形参定义为引用或指针类型。
(终于说完这个最简单的传递方式了,╮(╯▽╰)╭)
2.引用形参
引用形参的用法:1.让函数修改实参的值
2.向主调函数返回额外的结果(本来return就可以返回一个值给主调函数,而且引用参数可以改变实参的值,所以相当于返回了额外的结果)
3.利用const引用避免复制(当向函数传递大型对象时,需要使用引用来提高效率,如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为const引用)
这是一个不适宜复制实参的例子,该函数希望交换两个实参的值
void swap (int v1,int v2)
{
int tmp=v1;
v2=v1;
v1=tmp;
}
这个例子期望改变实参本身的值,但是swap无法影响实参本身,执行swap时,指示交换了其实参的局部副本,对实参根本没有改变。解决的方法是:将形参定义为引用类型。
void swap (int &v1,int &v2)
{
int tmp=v1;
v2=v1;
v1=tmp;
}
当调用swap(i,j)时,i和j的值才真正实现了交换。
更灵活的指向const的引用
应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不大灵活。非const引用形参既不能用const对象初始化,也不能用字面值或者产生右值的表达式实参初始化。(如果函数的形参是非const引用形参,表示在函数体内可能会修改该形参值,即会修改实参的值,因此不可以用const对象来做实参传递给这样的函数,所以不灵活。)
传递指向指针的引用
如果想编写一个与前面交换两个整数的swap类似的函数,实现两个指针的交换。已知需用*定义指针,用&定义引用,问题在于,如何将这两个操作符结合起来一获得指向指针的引用。
//交换两个指向整形的指针的值
void ptrswap(int *&v1,int *&v2)
{
int=*tmp=v2;
v2=v1;
v1=tmp;
}
形参int *&v1的定义,应该从右至左的理解:v1是一个引用,与指向int型对象的指针相关联。也就是说,v1只是传递ptrswap函数的任意指针的别名。
3.vector和其他容器类型的形参
由于复制vector会使得效率降低,多以如果形参是vector的话,我们常常将该形参声明为引用,避免复制。另一种方法在C++中更为常用,就是通过传递指向容器中需要处理的元素的迭代器来传递容器。
4.数组形参
由于数组是不可以复制的,所以不可以定义使用数组类型形参的函数。如果函数需要使用数组作为形参,那么就要通过操纵指向数组中元素的指针来处理数组。以下定义都是正确的:
void printValues(int*){}
void printValues(int[]){}
void printValues(int[10]){}
注意了,虽然不能直接传递数组,但是函数的形参可以写成数组的形式。上面三种定义是等价的,形参类洗个都是int*。
通常,将数组形参直接定义为指针要比使用数组语法定义更好。这样就明确地表示,函数操纵的是指向数组元素的指针,而不是数组本身。由于忽略了数组长度,形参定义中如果包含了数组长度则特别容易引起误解。
对于非引用型形参来说,编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的形参和数组元素的类型是否匹配,而不会检查数组的长度,所以即使实参数组的长度与形参不匹配时,编译也可以通过,但是在调用时会出错。
但是对于引用型形参来说,编译器还会检查是西安数组的大小与形参的大小是否匹配,所以如果实参数组的长度与形参不匹配,编译时就会报错。
如何确保函数的操作不超出数组实参的边界?方法有三:
1.在数组本身放置一个标记来检测数组的结束。C风格字符串就是采用这个方法的一个例子,它是一个字符数组,并且以空字符null作为结束的标记。处理C风格字符串的程序就是使用这个标记停止数组元素的处理。
2.使用标准库规范,传递指向数组第一个和最后一个元素的下一个位置的指针。void printValues(const int *beg, const int *end){},如果定义int j[2]={0,1},在调用该函数时,printValues(j,j+2).
3.显式传递表示数组大小的形参。void printValues(const int ia[], size_t size){}

5.可变形参
C++中的省略符形参是为了编译使用了varargs的C语言程序。
void foo(parm_list,...);
void foo(...);

‘陆’ C语言函数调用参数传递的是什么

C语言传递的是值而不是地址,这一点从VB转过来的程序员一定要注意。否则不经意间就会犯错误。另外下层函数修改上层函数变量不是一种好习惯,容易引发错误。C语言中函数可以返回一个函数值,如果你需要返回多个函数值可以用下面的形式

fun(int *a, int *b)
{ *a=1;*b=2;}
main()
{ int a, b;
fun(&a,&b) a,b的值被改变
}

如果按VB的习惯,
fun(int a, int b)
{ a=1;b=2;}
main()
{ int a, b;
fun(a,b);a、b的值没有改变
}
是错误的,main中的a,b和fun中的a,b完全是两码事,结果就是调运fun没有任何效果。

‘柒’ c语言中的值传递是怎么回事

实参的值传给了形参,形参可以看着是被调函数中的局部变量被调函数可有返回值也可以没有有返回值用return返回。例如int fun(int a,int b){ int c; c=a+b; return c;}主函数调用:int a,b,c;a=1,b=2;c=fun(a,b);没有返回值的函数通常形参都是指针变量,那样可以直接改变变量的值,例如fun(int *a){ *a=5;}主函数调用int b=1;fun(&b);这里调用fun后,b的值就变为5了而如果你的函数是fun(int a)这样b的值是不会变化的,这要你去理解指针

‘捌’ C语言中的传值调用时什么意思呀

在c语言中每一个变量都有两个属性一个是值,一个是址。比如

inta=2;

变量a的值是2,变量a的地址,可以用&取地址操作符获取,即&a。

因此以C语言的函数传递中具备两种方式传递参数,一种是传址,一种传值。比如

voidf1(intv){;}//函数f1
voidf2(int*p){;}//函数f2
f1(a);//这里传值
f2(&a)//这是传址

‘玖’ 简答题,c语言中函数传递参数的方式有哪2种,含义是什么

一:值传递,只是把一个变量的值复制到调用函数中去。
二:引用传递,把变量的地址(即指针)传到调用的函数去,调用的函数对变量的地址进行的操作 会改变参数的值。

‘拾’ c语言函数调用时,参数是如何传递的

建立中间变量(形参),把实参值赋值给中间变量,当被调函数返回值时,系统释放掉中间变量。

在程序中通过对函数的调用来执行函数体,其过程与其它语言的子程序调用相似。对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。

函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。



(10)c语言函数调用参数传递什么意思扩展阅读:

C语言中又规定在以下几种情况时可以省去主调函数中对被调函数的函数说明。

1、如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用。这时系统将自动对被调函数返回值按整型处理。例8.2的主函数中未对函数s作说明而直接调用即属此种情形。

2、当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。例如例8.1中,函数max的定义放在main 函数之前,因此可在main函数中省去对max函数的函数说明int max(int a,int b)。

3、如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明。