-
2021-05-25 08:03:02
1 什么是C语言的隐式函数声明
在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下面是一个例子:
int main(int argc, char** argv)
{
double x = any_name_function();
return 0;
}
单纯的编译上述源代码,并没有任何报错,只是在链接阶段因为找不到名为any_name_function的函数体而报错。
[smstong@centos192 test]$ gcc -c main.c
[smstong@centos192 test]$ gcc main.o
main.o: In function `main':
main.c:(.text+0x15): undefined reference to `any_name_function'
collect2: ld 返回 1
之所以编译不会报错,是因为C语言规定,对于没有声明的函数,自动使用隐式声明。相当于变成了如下代码:
int any_name_function();
int main(int argc, char** argv)
{
double x = any_name_function();
return 0;
}
2 带来的问题
2.1 隐式声明函数名称恰好在链接库中存在,但返回非int类型
前面给出的例子,并不会造成太大影响,因为在链接阶段很容易发现存在的问题。然而下面这个例子则会造成莫名的运行时错误。
#include
int main(int argc, char** argv)
{
double x = sqrt(1);
printf("%lf", x);
return 0;
}
gcc编译链接
[smstong@centos192 test]$ gcc -c main.c
main.c: 在函数‘main'中:
main.c:6: 警告:隐式声明与内建函数‘sqrt'不兼容
[smstong@centos192 test]$ gcc main.o
运行结果
1.000000
编译时会给出警告,提示隐式声明与内建函数'sqrt'不兼容。gcc编译器在编译时能够自动在常用库头文件(内建函数)中查找与隐式声明同名的函数,如果发现两者并不相同,则会按照内建函数的声明原型去生成调用代码。这往往也是程序员预期的想法。
上面的例子中隐式声明的函数原型为:
int sqrt(int);
而对应的同名内建函数原型为:
double sqrt(double);
最终编译器按照内建函数原型进行了编译,达到了预期效果。然而gcc编译器的这种行为并不是C语言的规范,并不是所有的编译器实现都有这样的功能。同样的源码在VC++2015下编译运行的结果却是:
VC++编译
warning C4013: “sqrt”未定义;假设外部返回 int
运行结果
2884223.000000
显然,VC++编译器没有没有所谓的“内建函数”,只是简单的按照隐式声明的原型,生成调用sqrt函数的代码。由于返回类型和参数类型的不同,导致错误的函数调用方式,产生莫名奇妙的运行时错误。
对着这种情况,由于返回类型的不同,两种编译器都可以给出警告信息,至少能引起程序员的注意。而下面这种情况,则更加隐蔽。
2.2 隐式声明函数名称恰好在链接库中存在,且返回int类型
测试代码如下:
#include
int main(int argc, char** argv)
{
int x = abs(-1);
printf("%d", x);
return 0;
}
此时,由于隐式声明的函数原型与gcc的内建函数原型完全相同,所以gcc不会给出任何警告,结果也是正确的。
而VC++则仍然会给出警告:warning C4013: “abs”未定义;假设外部返回 int。
无论如何,隐式声明的函数原型与库函数完全相同,所以链接运行都是没有问题的。
下面,稍微改动一下代码:
#include
int main(int argc, char** argv)
{
int x = abs(-1,2,3,4);
printf("%d", x);
return 0;
}
gcc下编译链接没有任何报错。
gcc编译链接
[smstong@centos192 test]$ gcc -c main.c
[smstong@centos192 test]$ gcc main.o
可见,gcc的内建函数机制并不关心函数的参数,只是关心函数的返回值。
vc++编译链接
warning C4013: “abs”未定义;假设外部返回 int
虽然这个例子的运行结果都是正确的,但是这种正确是“碰巧”的,因为额外的函数参数并没有影响到结果。这种偶然正确是程序中要避免的。
3 编程中注意事项
C语言的隐式函数声明,给程序员带来了各种困惑,给程序的稳定性带来了非常坏的影响。不知道当初C语言设计者是如何考虑这个问题的?
* 为了避免这种影响,强烈建议程序员重视编译器给出的关于隐式声明的警告,及时通过包含必要的头文件来消除这种警告。*
对于gcc来说,前面给出的那个abs(-1,2,3,4)的特殊例子,编译器根本不会产生任何警告,只能靠程序员熟悉自己调用的每一个库函数了。
为了避免这种问题,在C语言的C99版本中,无论如何都会给出警告。如gcc使用C99编译上述代码。
gcc -std=c99编译
[smstong@centos192 test]$ gcc -c main.c -std=c99
main.c: 在函数‘main'中:
main.c:5: 警告:隐式声明函数‘abs'
而C++则更严格,直接抛弃了隐式函数声明,对于未声明函数的调用,将直接无法通过编译。
g++编译
[smstong@centos192 test]$ g++ main.c
main.c: In function ‘int main(int, char**)':
main.c:5: 错误:‘abs'在此作用域中尚未声明
vc++编译(作为C++)
error C3861: “abs”: 找不到标识符
在函数强类型这一点上,C++确实比C更严格,更严谨。
更多相关内容 -
C语言 函数定义 函数声明 区别?
2021-05-20 18:54:29C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级...对于任何一种操作系统环境,C函数的ABI(Application Binary Interface)与汇编语言的子过程(routine/proce...C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
C语言也很适合搭配汇编语言来使用(往往可以通过内联汇编语言或与汇编语言目标文件一起连接。对于任何一种操作系统环境,C函数的ABI(Application Binary Interface)与汇编语言的子过程(routine/procedure)的ABI一定是完全兼容的。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。二十世纪八十年代至今的有关程序开发工具,一般都支持符合ANSI C的语法。
基本特性
1、C是高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来的工作单元。
2、C是结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
3、C语言功能齐全:具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。
4、C语言适用范围大:适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件操作的场合,优于其它高级语言,有一些大型应用软件也是用C语言编写的。
5、C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。
6、C语言文件由数据序列组成:可以构成二进制文件或文本文件。常用的C语言IDE(集成开发环境)有MicrosoftVisual Studio、Dev-C++、Code::Blocks、Borland C++ Builder、Watcom C++、GNU DJGPP C++、Lccwin32 C Compiler 3.1、High C,Turbo C、C-Free、Win-TC、Eclipse、Xcode等。常用的C语言编译器有:Visual C、GCC、Clang、Intel C++ Compiler、Turbo C等。
特有特点
C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。
C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。
不同的变量类型可以用结构体(struct)组合在一起。
只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。
部份的变量类型可以转换,例如整型和字符型变量。
通过指针(pointer),C语言可以容易的对存储器进行低级控制。
预编译处理(preprocessor)让C语言的编译更具有弹性。
优缺点
优点
1、简洁紧凑、灵活方便
C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
2、运算符丰富
C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
3、数据类型丰富
C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。
4、表达方式灵活实用
C语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,其程序设计更主动、灵活。它语法限制不太严格,程序设计自由度大,如对整型量与字符型数据及逻辑型数据可以通用等。
5、允许直接访问物理地址,对硬件进行操作
由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。
6、生成目标代码质量高,程序执行效率高
C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编程序生成的目标代码效率低10%~20%。
7、可移植性好
C语言在不同机器上的C编译程序,86%的代码是公共的,所以C语言的编译程序便于移植。在一个环境上用C语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境中运行。
8、表达力强
C语言有丰富的数据结构和运算符。包含了各种数据结构,如整型、数组类型、指针类型和联合类型等,用来实现各种数据结构的运算。C语言的运算符有34种,范围很宽,灵活使用各种运算符可以实现难度极大的运算。
C语言能直接访问硬件的物理地址,能进行位(bit)操作。兼有高级语言和低级语言的许多优点。
它既可用来编写系统软件,又可用来开发应用软件,已成为一种通用程序设计语言。
另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
缺点
1、 C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。
2、 C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。
基本构成
数据类型
C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
常量与变量
常量其值不可改变,符号常量名通常用大写。
变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。
数组
如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,方括内的索引值是从0算起的。
指针
如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。
指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值,不同于return(z)这样的仅能得到一个返回值。
指针是一把双刃剑,许多操作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。
字符串
C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件。
文件输入/输出
在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件;中。
标准输入/输出
有三个标准输入/输出是标准I/O库预先定义的:
stdin标准输入
stdout标准输出
stderr输入输出错误
运算
C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,对此合理进行分类,找出它们与数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2.13级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。
函数(function),名称出自清朝数学家李善兰的著作《代数学》。之所以如此翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量
函数的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。
定义:一般的,在一个变化过程中,有两个变量x、y,如果给定一个x值,相应的就确定唯一的一个y,那么就称y是x的函数,其中x是自变量,y是因变量,x的取值范围叫做这个函数的定义域,相应y的取值范围叫做函数的值域。
表示方法:
解析式法
用含有数学关系的等式来表示两个变量之间的函数关系的方法叫做解析式法。这种方法的优点是能简明、准确、清楚地表示出函数与自变量之间的数量关系;缺点是求对应值时往往要经过较复杂的运算,而且在实际问题中有的函数关系不一定能用表达式表示出来。
列表法
用列表的方法来表示两个变量之间函数关系的方法叫做列表法。这种方法的优点是通过表格中已知自变量的值,可以直接读出与之对应的函数值;缺点是只能列出部分对应值,难以反映函数的全貌。
图像法
把一个函数的自变量x与对应的因变量y的值分别作为点的横坐标和纵坐标,在直角坐标系内描出它的对应点,所有这些点组成的图形叫做该函数的图象。这种表示函数关系的方法叫做图象法。这种方法的优点是通过函数图象可以直观、形象地把函数关系表示出来;缺点是从图象观察得到的数量关系是近似的。
函数声明:
定义:
C语言编译系统是由上往下编译的.一般被调函数放在主调函数后面的话,前面就该有声明.不然C由上往下的编译系统将无法识别。正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用!函数的声明可以与定义分离,要注意的是一个函数只能被定义一次,但可以声明多次。
函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。这三个元素被称为函数原型,函数原型描述了函数的接口。定义函数的程序员提供函数原型,使用函数的程序员就只需要对函数原型编辑即可。
【返回类型】 函数名(参数1类型 参数1,参数2类型 参数2,……);
函数声明中的形参名往往被忽略,如果声明中提供了形参的名字,也只是用作辅助文档。另外要注意函数声明是一个语句,后面不可漏分号!
声明与定义的区别:
函数的声明与函数的定义形式上十分相似,但是二者有着本质上的不同。声明是不开辟内存的,仅仅告诉编译器,要声明的部分存在,要预留一点空间。定义则需要开辟内存。
函数的定义
函数的定义是一个完整的函数单元:
包含函数类型、函数名、形参及形参类型、函数体等
在程序中,函数的定义只能有一次
函数首部与花括号间不加分号
函数的声明
函数声明只是对编译系统的一个说明:
函数声明是对定义的函数的返回值的类型说明,以通知系统在本函数中所调用的函数是什么类型。
不包含函数体(或形参)
调用几次该函数就应在各个主调函数中做相应声明
函数声明是一个说明语句,必须以分号结束!
-
三角函数定义域和值域
2021-05-22 09:44:35三角函数定义域和值域2019-11-27 09:51:41文/董月sin(x),cos(x)的定义域为R,值域为〔-1,1〕;tan(x)的定义域为x不等于π/2+kπ,值域为R;cot(x)的定义域为x不等于kπ,值域为R;y=a·sin(x)+b·cos(x)+c的值域为[c-...三角函数定义域和值域2019-11-27 09:51:41文/董月
sin(x),cos(x)的定义域为R,值域为〔-1,1〕;tan(x)的定义域为x不等于π/2+kπ,值域为R;cot(x)的定义域为x不等于kπ,值域为R;y=a·sin(x)+b·cos(x)+c的值域为[c-√(a²+b²),c+√(a²+b²)]。
定义
三角函数(也叫做“圆函数”)是角的函数;它们在研究三角形和建模周期现象和许多其他应用中是很重要的。三角函数通常定义为包含这个角的直角三角形的两个边的比率,也可以等价的定义为单位圆上的各种线段的长度。更现代的定义把它们表达为无穷级数或特定微分方程的解,允许它们扩展到任意正数和负数值,甚至是复数值。
定义域和值域
sin(x),cos(x)的定义域为R,值域为〔-1,1〕
tan(x)的定义域为x不等于π/2+kπ,值域为R
cot(x)的定义域为x不等于kπ,值域为R
y=a·sin(x)+b·cos(x)+c的值域为[c-√(a²+b²),c+√(a²+b²)]
记忆口诀
三角函数是函数,象限符号坐标注。函数图像单位圆,周期奇偶增减现。
同角关系很重要,化简证明都需要。正六边形顶点处,从上到下弦切割;
中心记上数字一,连结顶点三角形。向下三角平方和,倒数关系是对角,
顶点任意一函数,等于后面两根除。诱导公式就是好,负化正后大化小,
变成锐角好查表,化简证明少不了。二的一半整数倍,奇数化余偶不变,
将其后者视锐角,符号原来函数判。两角和的余弦值,化为单角好求值,
余弦积减正弦积,换角变形众公式。和差化积须同名,互余角度变名称。
计算证明角先行,注意结构函数名,保持基本量不变,繁难向着简易变。
逆反原则作指导,升幂降次和差积。条件等式的证明,方程思想指路明。
万能公式不一般,化为有理式居先。公式顺用和逆用,变形运用加巧用;
一加余弦想余弦,一减余弦想正弦,幂升一次角减半,升幂降次它为范;
三角函数反函数,实质就是求角度,先求三角函数值,再判角取值范围;
利用直角三角形,形象直观好换名,简单三角的方程,化为最简求解集。
-
C语言——函数定义及用法【内部函数&外部函数&内联函数】
2020-02-05 11:41:09三:函数声明 补充: 四:调用函数 实例: 五:函数参数 六:内部函数&外部函数&内联函数 1.内部函数 定义: 2.外部函数 定义: 3.内联函数 定义: 注意: 七:main 函数的参数 1. main 函数...目录:
一:定义
函数是一组一起执行一个任务的语句
每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数
函数声明告诉编译器函数的名称、返回类型和参数
函数定义提供了函数的实际主体
二:函数的一般形式
return_type function_name( parameter list ) { body of the function }
组成部分
1.返回类型
- 返回类型:一个函数可以返回一个值
- return_type 是函数返回的值的数据类型
- 有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void
2.函数名称
- 函数名称:这是函数的实际名称
- 函数名和参数列表一起构成了函数签名
注意:
函数名和参数列表一起构成了函数签名
意味着可以出现参数列表不同但是函数名相同的函数。
void print() { printf("hello world!"); } void print(int nums) { printf("%d\n",a); }
这是合法的!!!
3.参数
- 参数:参数就像是占位符
- 当函数被调用时,您向参数传递一个值,这个值被称为实际参数
- 参数列表包括函数参数的类型、顺序、数量
- 参数是可选的,也就是说,函数可能不包含参数
4.函数主体
- 函数主体:函数主体包含一组定义函数执行任务的语句
实例:
/* 函数返回两个数中较大的那个数 */ int max(int num1, int num2) { /* 局部变量声明 */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
该函数有两个参数 num1 和 num2,会返回这两个数中较大的那个数
三:函数声明
return_type function_name( parameter list );
补充:
在函数声明中,参数的名称并不重要,只有参数的类型是必需的
int max(int num1, int num2); 等价于 int max(int, int);
四:调用函数
当程序调用函数时,程序控制权会转移给被调用的函数
实例:
#include <stdio.h> /* 函数声明 */ int max(int num1, int num2); int main () { /* 局部变量定义 */ int a = 100; int b = 200; int ret; /* 调用函数来获取最大值 */ ret = max(a, b); printf( "Max value is : %d\n", ret ); return 0; } /* 函数返回两个数中较大的那个数 */ int max(int num1, int num2) { /* 局部变量声明 */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
运行结果:
Max value is : 200
由于程序是从上向下执行,所以函数要先声明,后调用
由于程序是从上向下执行,所以函数要先声明,后调用
五:函数参数
调用类型 描述 传值调用 该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。 引用调用 通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。 六:内部函数&外部函数&内联函数
根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数
内部函数又称静态函数
可以使函数的作用域只局限于所在文件
1.内部函数
定义:
如果一个函数只能被本文件中其他函数所调用,它称为内部函数
在定义内部函数时,在函数名和函数类型的前面加 static
static 类型名 函数名 (形参表)
2.外部函数
定义:
如果在定义函数时,在函数的首部的最左端加关键字 extern,则此函数是外部函数,可供其它文件调用
extern int max (int a,int b)
注意:如果在定义函数时省略 extern,则默认为外部函数
3.内联函数
定义:
内联函数是指用inline关键字修饰的函数
在类内定义的函数被默认成内联函数
内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质
内联扩展是用来消除函数调用时的时间开销
通常用于频繁执行的函数,对于小内存空间的函数非常受益
注意:
- 递归函数不能定义为内联函数
- 内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数
- 内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数
- 对内联函数不能进行异常的接口声明
七:main 函数的参数
main 函数其实与我们写的函数没有什么区别,它也会有自己的参数
1. main 函数带参数 :
int main( int argc, char *argv[] )
2.main函数没有参数:
int main()
3.argc 和 argv
argc 和 argv 是 main 函数的形式参数
这两个形式参数的类型是系统规定的
变量名称argc和argv是常规的名称,当然也可以换成其他名称
main 的两个参数的参数名如下:
int main( int argc, char *argv[] )
以写成下面这样:
int main( int test_argc, char *test_argv[] )
argc 是指传入参数的个数
argv[] 是一个指针数组,指向传递给程序的每个参数
4.如何传递给main函数的argc和argv的呢?
C程序在编译和链接后,都生成一个exe文件,执行该exe文件时,可以直接执行
也可以在命令行下带参数执行,命令行执行的形式为:
可执行文件名称 参数1 参数2 ... ... 参数n
可执行文件名称和参数、参数之间均使用空格隔开
命令行字符串将作为实际参数传递给main函数:
- (1) 可执行文件名称和所有参数的个数之和传递给 argc
- (2) 可执行文件名称(包括路径名称)作为一个字符串,首地址被赋给 argv[0],参数1也作为一个字符串,首地址被赋给 argv[1],... ...依次类推
八:函数参数传递都是值传递
本质上说,C 里面所有的函数参数传递,都是值传递
为什么?
因为指针传递之所以能改变传递参数变量的值,是因为 swap 函数交换的不是传递进来的指针本身,而是指针指向的值
实例:
void swap(int *x, int *y); void swap(int *x, int *y){ int temp; //这里操作的是指针指向的值 而不是指针 temp = *x; *x = *y; *y = temp; // 倘若直接交换指针 a、b的值不会交换 // temp = x; // x = y; // y = temp; } int main( int argc, char *argv[] ) { int a = 5; int b = 10; swap(a, b); //调用交换函数 printf("交换结果为 a = %d, b = %d\n",a,b); return 0; }
-
C语言之作用域
2021-05-18 09:57:55(2)基本来说,C语言变量的作用域规则是代码块作用域。意思就是这个变量起作用的范围是当前的代码块。代码块就是一对大括号{}括起来的范围,所以一个变量的作用域是:这个变量定义所在的{}范围内从这个变量定义开始... -
详解C语言中的wait()函数和waitpid()函数
2020-12-31 04:39:59C语言wait()函数:结束(中断)进程函数(常用) 头文件: #include <sys> #include 定义函数: pid_t wait (int * status); 函数说明:wait()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用... -
C语言函数
2019-06-05 09:57:43函数 1.函数的定义 1.1 函数的三要素 函数名 形参列表 函数体 函数名:标识符 形参列表: 不赋值的变量 函数体: 最主要(函数的要做什么) {}函数的作用域 (范围) 1.2 函数声明的时候要注意点 ... -
【C语言】函数定义时前加static 作用
2019-07-07 16:53:49C语言中函数定义时前加static 作用 1.作用 函数中加“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 2.好处 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否... -
什么是C语言函数
2021-05-18 16:39:03什么是C语言函数(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。(3)允许对构造类静态局部量... -
第七章 C语言函数_C语言全局变量和局部变量
2022-02-21 17:27:57定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。 几点说明: 1) 在 main 函数中定义的变量也是局部变量,只能在 main 函数中使用;... -
Shell中的函数、函数定义、作用域问题介绍
2021-01-10 10:26:01一、Shell中函数的定义 为了方便程序和管理和模块化并减少代码的重复,函数的确是一个好东西。而Shell中函数的定义有两种方法,如下: 代码如下: function fname() { statements; } 或 代码如下: fname() { ... -
C语言总结(函数)
2022-01-08 10:07:43C语言总结(函数) 一、函数的定义 ; 二、函数的调用 ;三、函数的嵌套调用 ;四、函数的递归调用 ; 五、函数的声明 ;六、变量的作用域和存储类别 -
C语言的声明和定义
2021-05-21 08:06:12或者都是定义或者都是声明???什么是定义:所谓的定义就是(编译器)创建一个对象,然后为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名.但注意,这个名字一旦和这块内存匹配起来... -
关于C中函数声明与定义
2020-07-30 07:55:02总结如下:1.一般情况下,函数在调用子函数时,子函数必须先声明,要不会报错。(一般都将函数的声明放在一下头文件里)2.如若子函数为返回值是int时,...3.static修饰的函数作用域为从声明/定义处到源文件结尾处为止。 -
C语言函数原型的作用
2019-10-29 21:27:20函数原型(Function Prototype):即函数声明给出了函数名、返回值类型、参数...有了函数声明,函数定义就可以出现在任何地方了,甚至是其他文件、静态链接库、动态链接库等。但是如果函数本身带static修饰,那么... -
C语言中声明和定义详解
2016-02-06 16:56:05变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。 变量声明:用于向程序表明变量的类型和名字。 定义也是声明,extern声明不是定义 定义也是... -
【C语言初学总结】--- C语言函数
2019-10-15 17:33:28函数定义就是函数体的实现,函数体就是一个代码块,他在函数调用执行时,与函数定义相反,函数声明出现在函数被调用的地方。 1.1函数注意点: 每条语句后边必须要有;号(条件语句等特殊情况除外) C语言中本身带了很... -
反三角函数的定义域和值域
2021-05-21 11:49:43反三角函数的定义域和值域2019-09-17 09:29:11文/颜雨反三角函数包括反正弦arcsinx,反余弦arccosx,反正切arctanx,反余切arccotx等,接下来一起看一下他们的定义域和值域是什么。什么是反三角函数反三角函数是一类... -
C语言中的作用域
2021-11-28 14:02:37作用域描述程序中可以**访问标识符的区域 **,一旦离开其作用域,程序便不能再访问该标识符 ...函数原型作用域的范围是从形参定义处到原型声明结束,这意味着编译器在处理函数原型中的形参时只.. -
C语言中的函数声明
2017-03-30 23:44:07C语言中的函数声明有三种方法:第一,使用extern关键字进行全局可用的声明;第二,使用不带extern关键字的默认声明方式,这种方式功能与第一种相同;第三,使用static关键字将函数声明为私有函数。 方法1,使用... -
《大学计算机C语言函数(1 函数的定义和使用)》.ppt
2020-01-20 17:52:42* * 第5章 函 数 5.1 程序设计的艺术 5.2 函数的定义和使用 5.3 数组作函数参数 5.4 变量的作用域 5.5 变量的存储类别 5.6 预处理指令 一函数的概念 函数是形式上独立功能上完整的程序段块在C程序设计中常将一些常用... -
C语言学习之路---Hello,World!
2021-05-22 17:31:23这是一个标准的C语言Hello World!程序,下面是该程序详解:#include int main(){printf("Hello,World!\n");return 0;}1.#include头文件包含#include是告诉编译器,包含一个头文件,在C语言中,任何库函数调用都需要提前... -
C语言函数为什么不可以声明默认参数?
2019-06-28 18:36:00为什么C语言函数声明不可以带有默认参数? 我们都知道C++可以在.h文件函数声明中添加默认参数。 比如 void err_exit(int, const char *, ...) __attribute__((noreturn)) LogOperation(char* config_path = ... -
【C】C语言函数中的变量(包括:作用域、存储类型)
2018-05-05 10:11:15C语言中变量按其作用域分,可分为局部变量和全局变量,具体的解释为: 局部变量(内部变量):在定义它的函数内有效,但是函数返回后失效; 全局变量(外部变量):在所有源文件内均有效。在同源文件的函数中使用... -
C语言基础知识变量的作用域和存储方式详细介绍
2020-12-26 04:45:33局部变量:在一个函数内部定义的变量或者函数的形式参数统称为局部变量 局部变量的使用范围:在函数内部定义的变量只能在本函数内部进行使用 2.简述变量按存储方式的分类 静态变量 自动变量 寄存器变量[寄存器... -
C语言函数是什么
2021-05-19 01:37:39C语言函数是什么C程序的全部工作都是由各式各样的函数完成的, 所以也把C语言称为函数式语言。下面百分网小编带大家一起来看看详细内容,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网!由于... -
C语言定义和声明的区别
2016-06-18 23:55:48定义和声明的根本区别: 定义创建了对象并为之分配了内存,声明没有分配内存! C语言中有32个关键字:如下表 1.auto:编译器在默认的缺省情况下,所有变量都是auto的。 2.register:该关键字... -
C语言类型的定义与声明
2021-05-21 08:49:00变量的声明有两种情况:(1) 一种是需要建立存储空间的(定义、声明)。例如:int a在声明的时候就已经建立了存储空间。(2) 另一种是不需要建立存储空间的(声明)。例如:extern int a其中变量a是在别的文件中定义的。...