c语言值传递的3种形式

c语言值传递的3种形式
c语言值传递的3种形式

//全部摘自别的博客,以前对值传递很迷糊,看完豁然开朗,整理下,来百度文库赚点分。

一、三道考题

开讲之前,我先请你做三道题目。(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?)

考题一,程序代码如下:

void Exchg1(int x, int y)

{

inttmp;

tmp = x;

x = y;

y = tmp;

printf("x = %d, y = %d\n", x, y);

}

main()

{

int a = 4,b = 6;

Exchg1(a, b);

printf("a = %d, b = %d\n", a, b);

return(0);

}

输出的结果为:

x = ____, y=____.

a = ____, b=____.

问下划线的部分应是什么,请完成。

考题二,程序代码如下:

void Exchg2(int *px, int *py)

{

inttmp = *px;

*px = *py;

*py = tmp;

printf("*px = %d, *py = %d.\n", *px, *py);

}

main()

{

int a = 4;

int b = 6;

Exchg2(&a, &b);

printf("a = %d, b = %d.\n", a, b);

return(0);

}

输出的结果为为:

*px=____, *py=____.

a=____, b=____.

问下划线的部分应是什么,请完成。

考题三,程序代码如下:

void Exchg3(int&x, int&y)

{

inttmp = x;

x = y;

y = tmp;

printf("x = %d,y = %d\n", x, y);

}

main()

{

int a = 4;

int b = 6;

Exchg3(a, b);

printf("a = %d, b = %d\n", a, b);

return(0);

}

输出的结果为:

x=____, y=____.

a=____, b=____.

问下划线的部分应是什么,请完成。你不在机子上试,能作出来吗?你对你写出的答案有多大的把握?正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧!)

好,废话少说,继续我们的探索之旅了。

我们都知道:C语言中函数参数的传递有:值传递、地址传递、引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有同感吧?

下面请让我逐个地谈谈这三种传递形式。

二、函数参数传递方式之一:值传递

(1)值传递的一个错误认识

先看考题一中Exchg1函数的定义:

void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数*/

{

inttmp;

tmp = x;

x = y;

y = tmp;

printf("x = %d, y = %d.\n", x, y);

}

问:你认为这个函数是在做什么呀?

答:好像是对参数x、y的值对调吧?

请往下看,我想利用这个函数来完成对a,b两个变量值的对调,程序如下:

main()

{

int a = 4,b = 6;

Exchg1(a, b); /*a,b变量为Exchg1函数的实际参数。*/

printf("a = %d, b = %d.\n”, a, b);

return(0);

}

我问:Exchg1()里头的printf("x = %d, y = %d.\n", x, y);语句会输出什么啊?我再问:Exchg1()后的printf("a = %d, b = %d.\n”, a, b);语句输出的是什么?

程序输出的结果是:

x = 6, y = 4.

a = 4,

b = 6.

为什么不是a = 6,b = 4呢?奇怪,明明我把a、b分别代入了x、y中,并在函数里完成了两个变量值的交换,为什么a、b变量值还是没有交换(仍然是a = 4、b = 6,而不是a = 6、b = 4)?如果你也会有这个疑问,那是因为你根本就不知实参a、b与形参x、y的关系了。

(2)一个预备的常识

为了说明这个问题,我先给出一个代码:

int a = 4;

int x;

x = a;

x = x + 3;

看好了没,现在我问你:最终a值是多少,x值是多少?

(怎么搞的,给我这个小儿科的问题。还不简单,不就是a = 4、x = 7嘛!)

在这个代码中,你要明白一个东西:虽然a值赋给了x,但是a变量并不是x变量哦。我们对x任何的修改,都不会改变a变量。呵呵!虽然简单,并且一看就理所当然,不过可是一个很重要的认识喔。

(3)理解值传递的形式

看调用Exch1函数的代码:

main()

{

int a = 4,b = 6;

Exchg1(a, b) /* 这里调用了Exchg1函数*/

printf("a = %d, b = %d.\n", a, b);

}

Exchg1(a, b)时所完成的操作代码如下所示。

int x = a; /* ←*/

int y = b; /* ←注意这里,头两行是调用函数时的隐含操作*/

inttmp;

tmp = x;

x = y;

y = tmp;

请注意在调用执行Exchg1函数的操作中我人为地加上了头两句:

int x = a;

int y = b;

这是调用函数时的两个隐含动作。它确实存在,现在我只不过把它显式地写了出来而已。问题一下就清晰起来啦。(看到这里,现在你认为函数里面交换操作的是a、b变量或者只是x、y变量呢?)

原来,其实函数在调用时是隐含地把实参a、b 的值分别赋值给了x、y,之后在你写的Exchg1函数体内再也没有对a、b进行任何的操作了。交换的只是x、y变量。并不是a、b。当然a、b的值没有改变啦!函数只是把a、b的值通过赋值传递给了x、y,函数里头操作的只是x、y的值并不是a、b的值。这就是所谓的参数的值传递了。

哈哈,终于明白了,正是因为它隐含了那两个的赋值操作,才让我们产生了前述的迷惑(以为a、b已经代替了x、y,对x、y的操作就是对a、b的操作了,这是一个错误的观点啊!)。

三、函数参数传递方式之二:地址传递

继续!地址传递的问题!

看考题二的代码:

void Exchg2(int *px, int *py)

{

inttmp = *px;

*px = *py;

*py = tmp;

printf("*px = %d, *py = %d.\n", *px, *py);

}

main()

{

int a = 4;

int b = 6;

Exchg2(&a, &b);

printf("a = %d, b = %d.\n”, a, b);

return(0);

}

它的输出结果是:

*px = 6, *py = 4.

a = 6,

b = 4.

看函数的接口部分:Exchg2(int *px, int *py),请注意:参数px、py都是指针。再看调用处:Exchg2(&a, &b);

它将a的地址(&a)代入到px,b的地址(&b)代入到py。同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了px、py。

px = &a;

py = &b;

呵呵!我们发现,其实它与值传递并没有什么不同,只不过这里是将a、b的地址值传递给了px、py,而不是传递的a、b的内容,而(请好好地在比较比较啦)整个Exchg2函数调用是如下执行的:

px = &a; /* ←*/

py = &b; /* ←请注意这两行,它是调用Exchg2的隐含动作。*/

inttmp = *px;

*px = *py;

*py = tmp;

printf("*px =%d, *py = %d.\n", *px, *py);

这样,有了头两行的隐含赋值操作。我们现在已经可以看出,指针px、py的值已经分别是a、b变量的地址值了。接下来,对*px、*py的操作当然也就是对a、b变量本身的操作了。所以函数里头的交换就是对a、b值的交换了,这就是所谓的地址传递(传递a、b的地址给了px、py),你现在明白了吗?

四、函数参数传递方式之三:引用传递

看题三的代码:

void Exchg3(int&x, int&y) /* 注意定义处的形式参数的格式与值传递不同*/

{

inttmp = x;x = y;

y = tmp;

printf("x = %d, y = %d.\n", x, y);

}

main()

{

int a = 4;

int b = 6;

Exchg3(a, b); /*注意:这里调用方式与值传递一样*/

printf("a = %d, b = %d.\n”, a, b);

}

输出结果:

x = 6, y = 4.

a = 6,

b = 4. /*这个输出结果与值传递不同。*/

看到没有,与值传递相比,代码格式上只有一处是不同的,即在定义处:

Exchg3(int&x, int&y)

但是我们发现a与b的值发生了对调。这说明了Exchg3(a, b)里头修改的是a、b变量,而不只是修改x、y了。

我们先看Exchg3函数的定义处Exchg3(int&x, int&y)。参数x、y是int的变量,调用时我们可以像值传递(如:Exchg1(a, b); )一样调用函数(如:Exchg3(a, b);)。但是x、y 前都有一个取地址符号“&”。有了这个,调用Exchg3时函数会将a、b 分别代替了x、y了,我们称:x、y分别引用了a、b变量。这样函数里头操作的其实就是实参a、b本身了,也就是说函数里是可以直接修改到a、b的值了。

最后对值传递与引用传递作一个比较:

1)在函数定义格式上有不同:

值传递在定义处是:Exchg1(int x, int y);

引用传递在这义处是:Exchg3(int&x, int&y);

2)调用时有相同的格式:

值传递:Exchg1(a, b);

引用传递:Exchg3(a, b);

3)功能上是不同的:

值传递的函数里操作的不是a、b变量本身,只是将a、b值赋给了x、y。函数里操作的只是x、y变量而不是a、b,显示a、b的值不会被Exchg1函数所修改。

引用传递Exchg3(a, b)函数里是用a、b分别代替了x、y。函数里操作的就是a、b变量的本身,因此a、b的值可在函数里被修改的。

C语言输入输出函数printf与scanf的用法格式

C 语言输入输出函数printf 与scanf 的用法格式 printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式控制字符, 以"%"开始, 后跟一个或几个控制字符,用来确定输出内容格式。 参量表是需要输出的一系列参数,可以是常量、变量或表达式,其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。 例如: printf("a=%d b=%d",a,b); 1. 格式控制符Turbo C 2.0提供的格式化规定符如下: 格式控制字符 参量表 正常字符

━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e,%E 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g,%G 自动选择合适的表示法 ━━━━━━━━━━━━━━━━━━━━━━━━━━ printf的附加格式说明字符 字符说明 l 用于长整型数或双精度实型,可加在格式 符d、o、x、u和f前面 m(代表一个正整数据最小输出显示宽度

C语言选择题(三)

第七、八、九章选择题 1.C语言中的函数[1] [1] A.嵌套定义和嵌套调用均可 B.可以嵌套定义但不可以嵌套调用 C.嵌套调用和递归调用均可 D.可以嵌套调用但不可以递归调用 2.C语言中函数返回值的类型是由[2]决定的 [2] A. return语句中的表达式类型 B.调用函数时临时指定 C.定义函数时所指定的函数类型 D.对被调用函数声明时指定 3.下列调用函数的说法中不正确的是[3] [3] A.主调函数和被调函数可以不在同一文件中 B.实际参数和形式参数可以同名 C.若用值传递方式,则形式参数不予分配内存 D.函数间传递数据可使用全局变量 E.函数调用时,若形、实参数均为数组名,则其传递方式是地址传递方式 4.若用数组名作为函数调用时的实参,则实际上传递给形参的是[4] [4] A.数组中全部元素的值 B.数组的第一个元素的值 C.数组的首地址 D.数组元素的个数 5.void作为函数的参数时,表示[5] [5] A.该函数无返回值 B.实参可为任意值 C.函数无参数 D.该函数可返回任意值 6.下面对typedef 不正确的叙述是[6] [6] A.用typedef 可以定义各种类型名,但不能定义变量 B.使用typedef 有利于程序的通用和移植 C.用typedef可以增加新类型 D.用typedef 只是将已存在的类型用一个新的标识符表示 7.使用共用体union的目的是[7] [7] A.将一组相同数据类型的数据作为一个整体,以便程序中使用 B.将一组相同数据类型的数据作为一个整体,以便其中的成员共享同一存储空间 C.以便其中的成员共享同一存储空间 D.将一组相关数据作为一个整体,以便程序中使用 8.下列数据类型中不属于构造类型的是[8] [8]A.数组型 B.结构型 C.枚举型 D.共用型 9.在C语言中,[9]类型变量的所有成员以覆盖方式共享存储单元 [9]A.数组型 B.结构型 C.共用型 D.枚举型 10.若程序中含有定义: struct abc { int x;int y;} struct abc s1,s2;则[10] [10] A.能编译、链接、运行 B.能编译、链接,但不能运行 C.编译时出错 D.能编译、但链接出错 11.C语言中,对于存储类型为[11]的变量,只有在使用它们时才占用存储单元 [11] A. static 和auto B.register 和 extern

C语言复习题85424

一、填空: 1.整型数据变量声明中所使用的关键字是 int 。 2.设float x=2.5,y=4.7; int a=7;,表达式x+a%3*(int)(x+y)%2/4的值为 2.5 。 3.printf(“My age is %d.”, age); 函数中,使用%d表示输出的是整型类型的数 据。 4.每个源程序有且只有一个主函数,系统总是从该函数开始执行C语言程序。 5.设int x=5,y,z;执行y=z=x;x=y==z;后,变量x的结果是 1 。 6. C 语言中,数组在内存中占一片的存储区,由代表它的首地址。数 组名是一个,不能对它进行赋值运算。 7.函数的参数为char *类型时,形参与实参结合的传递方式为。 8.C程序编译、连接后生成程序。 9.当a=10,b=4,c=2时,表达式f=a>b>c的值是。 10.字符串数组与字符数组的在长度至少一个元素。 11.若函数的形式参数是指针类型,则实参可以是或。 12.如定义语句为char a[ ]= "windows",b[ ]= "7";,语句printf("%s",strcat(a,b));的输出结果 为。 13.请在下面的程序段中填写正确的格式说明符: int main(void) { float salary; printf(“Enter your desired monthly salary:.”, salary); } 14.C程序编译后生成程序。 15. C 语言的标识符只能由、数字和三种字符组成。 16.设有定义int y; ,分别写出描述“y是偶数”的表达式,“y是奇 数”的表达式。 17.C语言没有字义专门的字符串变量类型,而是把它存储在数组中。 18.字符串常量"\\\22a,0\n\""的长度是。 19.字符串存储到数组中时,在数组的最后将增加一个标记字符串结束的字 符。 20.设有定义语句static int a[3][4] ={{1},{2},{3}}; 则a[1][0]值为,a[1][1] 值 为,a[2][1]的值为。 21.假设int a=7; 执行语句a+=a-=a*a; 后,a的值是。 22.若自定义函数要求返回一个值,则应在该函数体中有一条语句,若自定义 函数要求不返回一个值,则应在该函数说明时加一个类型说明符

C语言中参数的传值问题

C 语言中参数的传值问题 第1页 C 语言中参数的传值一直比较含糊,今天在网上看到三个面试题的详解,感觉讲的很好,就拿来记下,方便学习和记忆。 1. 考题一:程序代码如下: void Exchg1(int x, int y) { int tmp; tmp=x; x=y; y=tmp; printf(“x=%d,y=%d/n”,x,y) } void main() { int a=4,b=6; Exchg1 (a,b) ; printf(“a=%d,b=%d/n”,a,b) } 输出的结果: x=____, y=____ a=____, b=____ 问下划线的部分应是什么,请完成。 2. 考题二:代码如下。 Exchg2(int *px, int *py) { int tmp=*px; *px=*py; *py=tmp; print(“*px=%d,*py=%d/n”,*px,*py); } main() { int a=4; int b=6; Exchg2(&a,&b); Print(“a=%d,b=%d/n”, a, b); } 输出的结果为: *px=____, *py=____ a=____, b=____ 问下划线的部分应是什么,请完成。 3. 考题三: Exchg2(int &x, int &y) { int tmp=x; x=y; y=tmp; print(“x=%d,y=%d/n”,x,y); } main() { int a=4; int b=6; Exchg2(a,b); Print(“a=%d,b=%d/n”, a, b); } 输出的结果: x=____, y=____ a=____, b=____ 问下划线的部分输出的应是什么,请完成。 你不在机子上试,能作出来吗?你对你写出的答案有多大的把握? 正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧!) 好,废话少说,继续我们的探索之旅了。 我们都知道:C 语言中函数参数的传递有:值传递,地址传递,引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有同感吧? 下面请让我逐个地谈谈这三种传递形式。 二、函数参数传递方式之一:值传递 1. 一个预备的常识 为了说明这个问题,我先给出一个代码: int a=4; int x; x=a; x=x+3; 看好了没,现在我问你:最终a 值是多少,x 值是多少? (怎么搞的,给我这个小儿科的问题。还不简单,不就是a==4 x==7嘛!) 在这个代码中,你要明白一个东西:虽然a 值赋给了x ,但是a 变量并不是x 变量哦。我们对x 任何的修改,都不会改变a 变量。呵呵!虽然简单,并且一看就理所当然,不过可是一个很重要的认识喔。

c语言输入输出函数知识点总结

c语言输入输出函数知识点总结 1.I/O input output(输入端,输出端) 输入:从计算机向外部输出设备(显示器,打印机)输出数据。 输出:从输入设备(键盘、鼠标、扫描仪)向计算机输入数据。 2.C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数实现的。 3.字符输出函数一般形式:putchar(a);a可以是字符型变量、整型变量、字符常量、整型常量。函数作用:向终端输出一个字符。 4.字符输入函数一般形式:a=getchar( );函数作用:从终端输入一个字符。函数值:从输入设备得到的字符。 5.格式输出字符 %d:以十进制输出整数;%o:以八进制形式输出整数;%c:以字符形式输出一个字符;%s:输出字符串;%f:以小数形式输出单、双精度数,隐含输出六位小数。 6.getchar一次只能输入一个字符,有几个getchar()就输入几个字符,多输入的计算机不能识别。 7.getchar()输入的时候,空格键、Enter键、Tab键不能乱用,他们都当成字符对待。 printf("%d,%c,%f,%o,%x,%s",a,b,c,d,e,f); .......................................... 8.格式控制都是小写字母; 9.格式控制与后面要输出的变量是一一对应;................................................... 10.printf("%md",a); 1).m是整数; 2).m是指输出的结果占m列宽度; 3).m是正整数的话,输出结果差几列左补几个空格; m是负整数的话,输出结果差几列右补几个空格; 4).如果m的绝对值小于原来数的宽度,则原样输出。................................................... 11.printf("%m.nf",a); 1).m是指输出占几列宽度,n是指输出结果小数点后保留几位有效数字; 2).m是正整数的话,输出结果差几列左补几个空格; m是负整数的话,输出结果差几列右补几个空格; 3).printf("%2.5f",a); m

C语言中的函数间数据传递

理论广角 C语言是一种结构化程序设计语言,而结构化程序设计的总体思想是采用模块化结构,自上而下,逐步求精。即首先把一个复杂的大问题分解为若干相对独立的小问题,如果小问题仍较复杂,则可以把这些小问题又继续分解成若干子问题这样不断地分解,使得小问题或子问题简单到能够直接用程序的三种基本结构表达为止。然后,对应每一个小问题或子问题编写出一个功能上相对独立的程序块来,这种像积木一样的程序块被称为模块。 而每个模块可以由实现不同功能的函数组成。C语言的函数有两种:一是库函数(标准函数,C语言程序自带),用户可以直接调用;另一类是自定义函数,由用户根据使用的目的自己设计。可以说,C语言的程序是由函数组成,而在函数之间存在相互调用及调用时数据的传递问题。 在 C 语言中,我们通过函数实现模块化程序设计思想,即用函数实现功能模块的定义,然后通过函数之间的调用来实现程序功能。因此,程序中的函数根据其在某个程序中的使用方式的不同分为主调函数和被调用函数。函数本身并没有这种区分。函数间也可互相调用。有参函数的参数是主调函数和被调用函数进行数据传递的主要方式。无参函数不需要数据传递。参数有形式参数和实在参数之分。在函数的定义和说明语句中,我们将函数名后面括号中的参数称为形式参数,简称“形参”;在函数的调用语句中函数名后面括号中用的参数称为实在参数,简称“实参”。当函数被调用时,主调函数通过实参要向被调用函数的形参传递数据;函数调用并完成一定的功能后,也要向主调函数返回一些数据。在函数调用中,被调用函数应在主调函数之前定义 或被声明,如是系统提供的库函数,一般应将放该函数头文件用#include包含到本文件中;如果是用户自己定义的函数,则该函数与调用它的函数在同一文件中。被调用函数的形参应确定数据类型;而在函数调用时,用被调用函数名和实参的形式调用,实参的数据类型与形参应一致,否则易出错。 根据作者的多年教学经验,函数间的数据传递是C语言初学者的难点之一。下面重点介绍函数间的数据传递方式。 一、值传递方式 当形参为变量而实参为变量、某个数组元素、常量或表达式时,在函数调用过程中数据传递通常使用的是值传递方式。既在程序执行中,系统会给形参和实参分别分配内存单元,在函数调用时,程序将实参的值传递给形参,存在系统分配的内存单元中,供被调用函数使用,形参和实参使用不同的内存单元;函数执行完毕,形参不将处理后的值返回给实参,实参的值不变,被调用函数最多只能通过ruturn语句返回一个值给主调函数,形参的内存单元被释放。在此程序中,通过把主调函数中被调用函数名后的实参(即变量的值)赋值给被调用函数的形参(变量),由被调用函数进行处理,从而实现主调函数与被调用函数间数据的传递。在这种数据传递方式中,函数最多只能返回一个值,这就有一定的局限性。 例1:采用值传递方式交换两个变量的数据并求和。 swap-sum (int x, int y) /*定义交换及求和函数*/{int temp; printf(“2.x=%d y=%d\n”, x, y );temp=x; x=y; y=temp; /*进行值的交换*/ printf(“3.x=%d y=%d\n”, x, y );return (x+y ); /*返回变量求和的值*/}main() /*主函数*/ {int a, b, sum;scanf (“1.a=%d, b=%d”, &a, &b );sum=swap-sum(a, b ); printf (“4.a=%d b=%d\n”, a, b );printf (“sum=%d\n”, sum);}运行结果为:1.a=9 b=132.x=9 y=133.x=13 y=94.a=9 b=13sum=22 从运行结果,在被调用函数中交换形参变量的值并不影响实参变量的值,从被调用函数中返回主调函数的值只能通过return语句。 二、地址传递方式 当函数调用时,被调用函数的形参和实参为指针变量或数组时,函数间的数据传递使用的是地址传递方式。既在程序的执行过程中,系统给实参分配存储空间;在函数调用时,将实参获得的存储空间的地址传递给形参,使形参指向同一存储空间,当形参指向存储空间的值参与被调用函数的处理,也就是实参指向存储空间的值被处理。被调用函数执行完毕返回主调函数时,由于形参和实参指向同一存储空间,形参指向的存储空间的值的变化也就是实参指向存储空间的值的变化。从而实现被调用函数返回多个值给主调函数。如形参和实参使用的是数组时,传递的是数组首元素的地址。应注意,在函数中被处理的是形参指向的存储空间中存储的值,而不是存储空 C 语言中的函数间数据传递 [摘 要]C语言是结构化程序设计语言,其程序是由模块组成,而模块由完成不同功能的函数组成,函数 间存在相互调用和数据传递问题。数据传递分为值传递方式、地址传递方式、全局变量传递方式,每种方式传递的内容、要求不同,各有其应用的优点和局限性。 [关键词]函数 数据传递 值传递方式 地址传递方式 全局变量 学术要论

C语言输入输出函数格式详解

1、输入和输出: 输入:输入也叫读,数据由内核流向用户程序 输出:输出也称写、打印,数据由用户程序流向内核 以下介绍一些输入输出函数,尽管都是一些有缺陷的函数,但比较适合初学者使用 2、printf用法(其缺陷在于带缓存) printf输出时必须加上\n(刷新缓存) 解释:第一幅图没有加'\n',不会刷新缓存区,则不会打印出来;第二幅图是因为主函数结束时刷新了缓存区,但由于没有换行符,所以没有换行便显示了后面的内容;第三幅图时正常打印。 变量定义的是什么类型,在printf打印时就需要选择什么格式符,否则会造成数据的精度丢失(隐式强转),甚至会出现错误

修饰符功能 m输出数据域宽,数据长度

C语言函数调用三种方式 传值调用,引用调用和传地址调

C语言函数调用三种方式传值调用,引用调用和传地址调 我想,你只要看了C语言上关于传值函数调用的测试题,一切都会了然于胸:1. 考题一:程序代码如下: void Exchg1(int x, int y) { int tmp; tmp=x; x=y; y=tmp; printf(“x=%d,y=%d\n”,x,y) } void main() { int a=4,b=6; Exchg1 (a,b) ; printf(“a=%d,b=%d\n”,a,b) } 输出的结果: x=____, y=____ a=____, b=____ 问下划线的部分应是什么,请完成。 2. 考题二:代码如下。 Exchg2(int *px, int *py) { int tmp=*px; *px=*py; *py=tmp; print(“*px=%d,*py=%d\n”,*px,*py); } main()

{ int a=4; int b=6; Exchg2(&a,&b); Print(“a=%d,b=%d\n”, a, b); } 输出的结果为: *px=____, *py=____ a=____, b=____ 问下划线的部分应是什么,请完成。 3. 考题三: Exchg2(int &x, int &y) { int tmp=x; x=y; y=tmp; print(“x=%d,y=%d\n”,x,y); } main() { int a=4; int b=6; Exchg2(a,b); Print(“a=%d,b=%d\n”, a, b); } 二.函数参数传递方式之一:值传递 1.值传递的一个错误认识 先看题一中Exchg1函数的定义: void Exchg1(int x, int y) //定义中的x,y变量被称为Exchg1函数的形式参数{

C语言字符串的输入和输出

C语言字符串的输入和输出 字符串的输入和输出 %c人为加入\0进行输入输出 %s直接输入输出 *输入输出字符串时字符数组应有足够的存储空间,指针变量作为输入项时,指针必须已经指向确切的、足够大的存储空间 %s的使用 scanf("%s",地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 例:char str[15]; scanf("%s",str); abc123 1.不读入空格和回车,从空格处结束 2.输入字符串长度超过字符数组元素个数,不报错 3.当输入项为字符指针时,指针必须已指向确定的有足够空间的连续 存储单元 4.当为数组元素地址时,从此元素地址开始存放 2.printf("%s",地址值) 输出时遇到第一个'\0'为止 3.gets和puts函数 开头必须stdio.h #include"stdio.h"

1.gets(地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 4.当为数组元素地址时,从此元素地址开始存放 5.printf("%s",地址值) 输出时遇到第一个'\0'为止 6.gets和puts函数 开头必须stdio.h #include"stdio.h" 1.gets(地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 7.例: char str[10]; gets(str); 包括空格符 8. 2.puts(字符串起始地址) 遇第一个'\0'结束,自动加入换行符 9.字符串数组:数组中每个元素都是一个存放字符串的数组 可以将一个二维数组看作是字符串数组 10.char ca[3][5]={"A","BB","CCC"}; A\0 B B\0 C C C\0 字符型指针数组 char*pa[3]={"a","bb","ccc"}; pa[0]pa[1]pa[2] 可以重新赋值gets(pa[2]);

C语言函数参数传递(非常重要)

一、三道考题 开讲之前,我先请你做三道题目。(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: void Exchg1(int x, int y) { int tmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d\n", x, y); } main() { int a = 4,b = 6; Exchg1(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x = ____, y=____. a = ____, b=____. 问下划线的部分应是什么,请完成。 考题二,程序代码如下: void Exchg2(int *px, int *py) { int tmp = *px; *px = *py; *py = tmp; printf("*px = %d, *py = %d.\n", *px, *py); } main() { int a = 4; int b = 6; Exchg2(&a, &b); printf("a = %d, b = %d.\n", a, b); return(0); } 输出的结果为为: *px=____, *py=____.

a=____, b=____. 问下划线的部分应是什么,请完成。 考题三,程序代码如下: void Exchg3(int &x, int &y) { int tmp = x; x = y; y = tmp; printf("x = %d,y = %d\n", x, y); } main() { int a = 4; int b = 6; Exchg3(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x=____, y=____. a=____, b=____. 问下划线的部分应是什么,请完成。你不在机子上试,能作出来吗?你对你写出的答案有多大的把握?正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧!) 好,废话少说,继续我们的探索之旅了。 我们都知道:C语言中函数参数的传递有:值传递、地址传递、引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有同感吧? 下面请让我逐个地谈谈这三种传递形式。 二、函数参数传递方式之一:值传递 (1)值传递的一个错误认识 先看考题一中Exchg1函数的定义: void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数*/ { int tmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d.\n", x, y); }

C语言常考的知识点

C语言常考的知识点: 总体上必须清楚的: 1)程序结构是三种:顺序结构 , 循环结构(三个循环结构), 选择结构(if 和switch) 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。 3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址. 4)bit是位是指为0 或者1。 byte 是指字节, 一个字节 = 八个位. 5)一定要记住二进制如何划成十进制。 概念常考到的: 1、编译预处理不是C语言的一部分,不再运行时间。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。 2、每个C语言程序中main函数是有且只有一个。 3、在函数中不可以再定义函数。 4、算法的是一定要有输出的,他可以没有输入。 5、break可用于循环结构和switch语句。 6、逗号运算符的级别最低。 第一章 1)合法的用户标识符考查: 合法的要求是由字母,数字,下划线组成。有其它元素就错了。

并且第一个必须为字母或则是下划线。第一个为数字就错了。 关键字不可以作为用户标识符号。main define scanf printf都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。 2)实型数据的合法形式: 2.333e-1 就是合法的,且数据是2.333×10-1。 考试口诀:e前e后必有数,e后必为整数。. 3)字符数据的合法形式:: '1' 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。 '0' 的ASCII数值表示为48,'a' 的ASCII数值是97,'A'的ASCII数值是65。 4) 整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节: 考试时候一般会说,在16位编译系统,或者是32位系统。碰到这种情况,不要去管,一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节就可以了。 5)转义字符的考查: 在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在。 在程序中 int a = 06d, 是一个八进制的形式。 在转义字符中,’\x6d’ 才是合法的,0不能写,并且x是小写。 ‘\141’ 是合法的, 0是不能写的。 ‘\108’是非法的,因为不可以出现8。 6)算术运算符号的优先级别: 同级别的有的是从左到右,有的是从右到左。 7)强制类型转换: 一定是(int)a不是 int(a),注意类型上一定有括号的。 注意(int)(a+b)和(int)a+b 的区别。前是把a+b转型,后是把a转型再加b。

C语言中文件_数据的输入输出_读写

C语言中文件,数据的输入输出,读写. 文件是数据的集合体,对文件的处理过程就是对文件的读写过程,或输入输出过程。 所谓文件是指内存以外的媒体上以某种形式组织的一组相关数据的有序集合。文件分类: 顺序文件,随机文件。 文本文件和二进制文件。 文本文件也称为ASCII文件,在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。 文本文件可以在屏幕上按字符显示,源程序文件就是文本文件,由于是按字符显示,所以能读懂文件内容。 二进制文件是按二进制编码方式来存放的。这里主要讨论文件的打开,关闭,读,写,定位等操作。 文件的存取方法 C程序的输入输出(I/O)有两种方式:一种称为标准I/O或流式I/O,另一种称为低级I/O。流式I/O是依靠标准库函数中的输入输出函数实现的。低级I/O利用操作系统提供的接口函数(称为底层接口或系统调用)实现输入输出,低级I/O 主要提供系统软件使用。 在C语言中用一个FILE类型的指针变量指向一个文件,(FILE类型是系统在stdio.h中定义的描述已打开文件的一种结构类型),这个指针称为文件指针。FILE *指针变量标识符; 如 FILE *fp; 文件的打开与关闭 所谓打开文件,指的是建立文件的各种有关信息,并使文件指针指向该文件,以便对它进行操作。 关闭文件则是断开指针与文件之间的联系,也就禁止再对该文件进行操作。 1、fopen 函数原型:FILE *fopen(const char *filename,const char *mode); Fopen函数用来打开一个文件,前一部分用来说明文件路径及文件名,后一部分mode指出了打开文件的存取方式;返回值是被打开文件的FILE型指针,若打开失败,则返回NULL。打开文件的语法格式如下: 文件指针名=fopen(文件名,使用文件方式); 文件指针名必须被说明为FILE类型的指针变量。 FILE *fp; fp=fopen(“C:\\Windowss\\abc.txt”,”r”); 注意用两个反斜杠\\来表示目录间的间隔符。 存取文件的模式是一个字符串,可以由字母r,w,a,t,b及+组合而成,各字符的含

c语言值传递的3种形式

//全部摘自别的博客,以前对值传递很迷糊,看完豁然开朗,整理下,来百度文库赚点分。 一、三道考题 开讲之前,我先请你做三道题目。(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: void Exchg1(int x, int y) { inttmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d\n", x, y); } main() { int a = 4,b = 6; Exchg1(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x = ____, y=____. a = ____, b=____. 问下划线的部分应是什么,请完成。 考题二,程序代码如下: void Exchg2(int *px, int *py) { inttmp = *px; *px = *py; *py = tmp; printf("*px = %d, *py = %d.\n", *px, *py); } main() { int a = 4; int b = 6; Exchg2(&a, &b);

printf("a = %d, b = %d.\n", a, b); return(0); } 输出的结果为为: *px=____, *py=____. a=____, b=____. 问下划线的部分应是什么,请完成。 考题三,程序代码如下: void Exchg3(int&x, int&y) { inttmp = x; x = y; y = tmp; printf("x = %d,y = %d\n", x, y); } main() { int a = 4; int b = 6; Exchg3(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x=____, y=____. a=____, b=____. 问下划线的部分应是什么,请完成。你不在机子上试,能作出来吗?你对你写出的答案有多大的把握?正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧!) 好,废话少说,继续我们的探索之旅了。 我们都知道:C语言中函数参数的传递有:值传递、地址传递、引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有同感吧? 下面请让我逐个地谈谈这三种传递形式。 二、函数参数传递方式之一:值传递 (1)值传递的一个错误认识 先看考题一中Exchg1函数的定义: void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数*/ {

C语言格式输入函数SCANF()详解

scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。 scanf函数的一般形式 scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为: scanf(“格式控制字符串”,地址表列); 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。 例如:&a、&b分别表示变量a和变量b的地址。 这个地址就是编译系统在内存中给a、b变量分配的地址。在C 语言中,使用了地址这个概念,这是与其它语言不同的。应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 变量的地址和变量值的关系 在赋值表达式中给变量赋值,如: a=567; 则,a为变量名,567是变量的值,&a是变量a的地址。 但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的

地址。 【例4-7】 #include int main(void){ int a,b,c; printf("input a,b,c\n"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d",a,b,c); return0; } 在本例中,由于scanf函数本身不能显示提示串,故先用printf 语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,等待用户输入。在scanf语句的格式串中由于没有非格式字符在 “%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。如: 789 或 7 8 9 格式字符串 格式字符串的一般形式为:

C语言考试复习题

C语言 1.以下不属于C语言特点的是(D ) A.简洁紧凑,灵活方便 B.数据结构类型丰富 C.可移植性好 D.能够直接被计算机识别和执行 2.#include命令是一种(C ) A.函数 B.宏定义 C.预处理命令 D.条件编译命令 3.C语言中最简单的数据类型包括( B) A.整型,实型,逻辑型 B.整型,实型,字符型 C.整型,字符型,逻辑型 D.字符型,实型,逻辑型 4.以下整型常量正确的是(D)注:整型常量一般用十进制表示 A.078 B.20.0 C.2e10 D.Oxabc 5.字符常量只能用( B)括起来

A.圆括号 B.单引号 C.双引号 D.分号 6.以下不正确的叙述是( D) A.在C程序中,逗号运算符的优先级最低 B.在C程序中,APH和aph是两个不同的变量 C.若a和b类型相同,在计算了赋值表达式a=b后b中的值将放入a 中,而b中的值不变 D.运算优先级不同的运算符也要先看结合方向 7.设有int a=2,b=4,c=6,y=3;则执行语句y=((b=a+b),(b+c));后,y的值是(C ) A.6 B.10 C.12 D.3 8.C语言中用于结构化程序设计的三种基本结构是( D) A.if,switch,break B.If,while,for C.While,do-while,for D.顺序结构,选择结构,循环结构 9.下列叙述中正确的是( B)

A.调用printf()函数时,必须要有输出项 B.使用printf()函数时,必须在之前包含头文件stdio.h C.在C语言中,实数可以以十进制,八进制或十六进制的形式输出 D.调用getchar()函数读入字符时,可以从键盘上输入字符所对应的ASCII码 10.程序段: int x=12;( ) A.123.141593 B.12 3.141593 C.12,3.141593 D.12 3.141593 11.( D)不是算法的表达方式。 A.流程图 B.N-S流程图 C.伪代码 D.数据结构 12.有如下程序( ) #include“stdio.h” A.0 B.-1 C.1

C语言数据的输入与输出

C语言数据的输入与输出 一.Printf函数 函数原型在头文件stido.h中(使用时可以不包括) printf函数的返回值等于成功输入得数据的个数 1.printf函数得一般调用形式 printf(格式控制字符串,输出项列表) 格式控制字符串包括: (1)格式指示符 格式:%[标志][宽度][.精度][ [ h|l ] <类型>] (2)转义字符 如:'\n' , '\0' (3)普通字符 如:printf("max=%d,min=%d\n", a, b); “max=”和“,min=”是普通字符;“%d”是格式指示符;“\n”是转义字符; a和b是输出类表中的输出项(可以是常量、变量、或表达式)。 2.print函数中常用得格式控制说明 (1)数据类型控制字符 (2)数据类型修饰符 数据类型修饰符在%和数据类型控制符之间 如:长整型 "%ld" ,短整型 "%hd" (3)输出数据所占得宽度与精度

1)在%与格式字符之间插入一个整数来指示输出宽度。 若指定得输出宽度不够,系统自动以数据实际值得宽度作为输出宽度;如果指定的输出宽度多于数据实际所需宽度,数据右对齐,左边补以空格。 如:printf("%5d\n",42); \*输出结果: 42*\ 2)float或double类型得实型数可以用“整数1.整数2”的形式在指定总宽度的同时指定小数位得宽度。“整数1”指定输出数据得总宽度(小数点也要计算在内),“整数2”称之为精度,即小数位的位数。 注意:输出数据得实际精度并补取决与格式控制中的域宽和小数得位宽,而是取决于数据在计算机内的存储精度。 (4)标志控制字符 1)输出数据左对齐的标志字符“-”,在指定输出宽度之前。 如:printf("%-5d##\n",24); \*输出结果:24 ##*\ 2)输出数字总是带正负号得标志字符“+”,在%和格式字符之间(或指定得输出宽度前) 如:printf("%+d,%+d\n",100,-200); \*输出结果:+100,-200*\ 3)在输出数据前加前导0,可以在指定输出宽度得同时,在数据前面得多于空格处填以数字0。 如:printf("%05d\n",59); \*输出结果:00059*\ 二.Scanf函数 函数原型在头文件stdio.h中(使用时可以不包括) Scanf函数的返回值等于成功输入得数据的个数。 1.scanf函数得一般调用形式 scanf(格式控制字符串,地址列表) 格式控制字符串:%[*][输入数据宽度][ h|l ]<类型> 地址列表是各变量得地址,如:&a,&b

C语言入门教程10(函数参数的传递和值的返回)

前面我们说的都是无参数无返回值的函数,实际程序中,我们经常使用到带参数有返回值的函数。 一、函数参数传递 1.形式参数和实际参数 函数的调用值把一些表达式作为参数传递给函数。函数定义中的参数是形式参数,函数的调用者提供给函数的参数叫实际参数。在函数调用之前,实际参数的值将被拷贝到这些形式参数中。 2.参数传递 先看一个例子: void a(int); /*注意函数声明的形式*/ main() { int num; scanf(%d,&num); a(num); /*注意调用形式*/ } void a(int num_back) /*注意定义形式*/ { printf(%d\n,num_back); } 在主函数中,先定义一个变量,然后输入一个值,在a()这个函数中输出。当程序运行a(num);这一步时,把num的值赋值给num_back,在运行程序过程中,把实际参数的值传给形式参数,这就是函数参数的传递。 形参和实参可能不只一个,如果多于一个时,函数声明、调用、定义的形式都要一一对应,不仅个数要对应,参数的数据类型也要对应。 void a(int,float); main() { int num1; float num2; scanf(%d,&num1); scanf(%f,&num2); a(num1,num2); } void a(int num1_back,float num2_back) { printf(%d,%f\n,num1_back,num2_back);

} 上面的例子中,函数有两个参数,一个是整型,一个是浮点型,那么在声明、调用、定义的时候,不仅个数要一样,类型也要对应。如果不对应,有可能使的编译错误,即使没错误,也有可能让数据传递过程中出现错误。 再看一个例子: void a(int); main() { int num; scanf(%d,&num); a(num); } void a(int num) { printf(%d\n,num); } 看上面的例子,形式参数和实际参数的标识符都是num,程序把实际参数num的值传递给形式参数num。有些人可能就不明白了,既然两个都是num,为什么还要传递呢?干脆这样不就行了吗: void a(); main() { int num; scanf(%d,&num); a(); } void a() { printf(%d\n,num); } 其实不然,这就要涉及到标识符作用域的问题。作用域的意思就是说,哪些变量在哪些范围内有效。一个标识符在一个语句块中声明,那么这个标识符仅在当前和更低的语句块中可见,在函数外部的其实地方不可见,其他地方同名的标识符不受影响,后面我们会系统讲解作用域的问题。在这儿你就要知道两个同名的变量在不同的函数中是互不干扰的。

相关文档
最新文档