二级C试题(7)
在调用函数时,如果实参是简单的变量,它与对应形参之间的数据传递方式是A.地址传递 B.单向值传递C.由实参传形参,再由形参传实参 D.传递方式由用户指定
正确答案:B
函数调用时,在主调函数和被调函数之间,存在着数据的传递,利用参数传递数据和利用返回值传递数据是常用的两种方法。
函数调用时的参数叫做实参,函数执行时的参数叫做形参,利用参数传递数据实质是指函数实参和形参之间的数据传递过程。存在两种数据传递的方式:传值和传地址。
在 函数调用时,系统为形参准备空间,并把实参的值赋值到形参空间中,在调用结束后,形参空间将被释放,而实参的值保持不变,这就是传值传递方式。传值传递方 式中实参与形参之间的数据传递是单向的,只能由实参传递给形参。因而,即使形参的值在函数执行过程中发生了变化,也不会影响到实参值。在C语言中,当参数 类型是非指针类型和非数组类型时,均采用传值方式。
传地址方式把实参的地址赋值给形参,这样形参就可以根据地址值访问和更改实参的内容,从而实现双向传递。当参数类型是指针类型或数组类型时,均采用传地址方式。
区别于参数传值方式和返回值传递方式,传地址方式具有明显的优势。
(1)参数传值方式是主调函数与被调函数之间的单向数据传递方式,而参数的传地址方式则实现了二者之间的双向数据传递。
(2)函数的返回值每次只能把一个数据项从被调函数传递到主调函数,而参数的传地址方式却可一次性地传递多个数据项到主调函数。
根据上述描述,由于本题中说的实参是普通的变量,即非指针类型和数组类型,那么采用的是传值方式,是单向的。因此,本题的答案是B。
c语言函数调用时,实参和形参是如何传递的?什么时候要写指针型变量?
形参在函数定义时表示的一种占位符,实参就是里面存有实际变量值或者常量,函数调用时,实参值会自动传递给形参变量。指针比较复杂了。是变量的地址,如果参数类型是指针类型,则必须把实参变量的地址传递过去。当然在函数内也是间接引用实参变量的。
比如
void f(int * p) //形参是指针类型变量
下面是调用形式
f(&a); //调用函数,实参是变量a的地址。
之 所以采用指针作为函数参数的原因是因为:在函数调用的时候,只有从实参到形参的单向传递,在函数运行结束的时候,并没有形参到实参的反向传递。 当我们需要调用函数是为了对某些数据进行各种处理的时候,如果直接采用希望处理的数据的数据类型作为调用函数的形参的时候,虽然在函数调用的时候,我们希 望进行数据传递到了调用函数的形参中去,并在函数运行中进行了相关的处理,但是在函数运行结束后,形参马上释放,实参并无法得到函数运行结束后相对应的形 参中的数据。
当我们采用指针作为函数参数的时候,需要在调用的函数中也设置相对应的指针形参。在主程序中,将我们希望进行处理的数据与各个指针变量联系起来。在调用函 数的时候,将指向数据的指针实参传递到调用函数的形参中去,这样形参中的指针变量同样指向了我们希望处理的数据,然后对形参的指针变量指向的数据进行各种 希望的处理。这样,及时在调用函数运行完成后,虽然各个形参指针变量进行了释放。但是我们已经对我们希望处理的数据进行了相关的处理。这样就实现了“通过 调用函数使变量的值发生变化,在主调函数中使用这些已经改变了的值"的目的。
swap( int *p1 , int *p2 )
{
int temp ;
temp = *p1 ;
*p1 = *p2 ;
*p2 = temp ;
}
main ( )
{
int a , b ;
int *point_1 ; int *point_2 ;
scanf ( "%d,%d" , &a , &b ) ;
*point_1 = a ;
*point_2 = b ;
swap ( point_1 , point_2 ) ;
printf ( "\n%d,%d\n" , a , b ) ;
}
另外:我们在通过调用子函数改变主调函数中变量值的时候,不能通过改变子函数中的指针变量的值来实现。因为改变后的指针变量同样无法传递给主调函数。 我们只能通过改变子函数中指针变量所指向变量的值来实现我们所希望实现的功能。
C语言不允许以下的赋值:
struct student
{
int num;
char name[20];
};
struct student stu = {10101,"Li Lin"};
struct student stu1;
stu1 = stu;
但当结构体变量作为参数时,却能如下使用:
void print(struct student stu)
{
////////函数体
}
void main()
{
struct student
{
int num;
char name[20];
};
struct student stu = {10101,"Li Lin"};
print(stu);
}
当实参结构体向形参传值时,也可以看成是赋值操作啊,为什么这个就行呢,怎么理解啊?
char name[20]; 数组是不能相互赋值
#include <iostream>
using namespace std;
struct student
{
int num;
char chr[20];
};
int main()
{
struct student stu ={1001,"Liulin"};
cout<<stu.num<<endl;
cout<<stu.chr<<endl;
return 0;
}
2个相同结构体类型的结构体变量 是可以直接用"="赋值符号进行赋值,
语句在函数体外 所以才不可以执行.
说 数组不能直接相互赋值 但是当数组是结构体的一部分的时候
相同类型的结构体是可以直接赋值的
//代码完全能够通过
#include<stdio.h>
struct student
{
int num;
char name[20];
};
void main()
{
struct student a={100,"fhue"};
struct student b;
b = a;
printf("%d %s",b.num,b.name);
}
在vc 6.0 和 vs2005 中都试了,可以赋值,而且初始化以后也可以用结构体直接赋值。
vs2005中代码入下:
#include "stdafx.h"
#include <stdio.h>
#include<string.h>
struct student
{
int num;
char name[20];
};
struct student stu = {10101,"Li Lin"};
struct student stu1;
int _tmain(int argc, _TCHAR* argv[])
{
stu1.num=10;
strcpy(stu1.name,"asdf");
stu1=stu;
printf("%d\t%s\n",stu1.num,stu1.name);
getchar();
return 0;
}