C语言的变量声明与定义的区别
变量的定义与声明

1.变量的定义从前面的章节可以看出,程序中所有的东西几乎都有名字。
然而字面量却是个例外,它没有名字。
那么使用变量,我们就可以为某个值取名字了。
实际上,我们是为系统内存中用于保存数据的某块空间取名字。
ANSI C规定:变量必须“先定义、后使用”,因此当用C定义变量时,不仅需要指定变量名,而且还必须告诉编译器其存储的数据类型,变量类型告诉编译器应该在内存中为变量名分配多大的存储单元,用来存放相应变量的值(变量值),而变量仅仅是存储单元的别名,供变量使用的最小存储单元是字节(Byte)。
由此可见,每个变量都占据一个特定的位置,每个存储单元的位置都由“地址”唯一确定并引用,就像一条街道上的房子由它们的门牌号码标识一样。
即从变量中取值就是通过变量名找到相应的存储地址,然后读取该存储单元中的值,而写一个变量就是将变量的值存放到与之相应的存储地址中去。
由于变量的定义不是可执行代码,因此要求局部变量的定义必须位于用“{}包围的程序块”的开头,即在可执行代码的前面。
比如:int lower_limit = 80; //定义lower_limit为整型变量即在定义lower_limit为int类型数据时,系统就已经为变量lower_limit分配了存储单元。
请注意区分变量名和变量值这两个不同的概念,其中,lower_limit为变量名,80为变量lower_limit的值,即存放在变量lower_limit的存储单元中的数据。
那么到底如何获得变量的地址呢?C语言使用“&(地址运算符)加变量名”的方式获取变量的地址,比如,&lower_limit就代表变量lower_limit的地址,详见后续相关章节的描述。
一个定义只能指定一种变量类型,虽然后面所带的变量表可以包含一个或多个该类型的变量:int lower_limit , upper_limit , sum;但如果将一个定义语句中的多个变量拆开在多个定义语句中定义的话:int lower_limit; // lower_limit为数据下限int upper_limit;// upper_limit为数据上限int sum;// sum为求和的结果则可在各个定义语句中添加注释,则大大提高了程序的可阅读性,而且修改起来更加方便,但C编译器会忽略在每行右边用于描述变量用途的注释语句。
c语言声明与定义的区别

<声明与定义的区别>声明与定义的区别(Come from my colleague)1.变量的声明与定义变量的声明有两种情况:一种是需要建立存储空间的。
例如:int a 在声明的时候就已经建立了存储空间。
另一种是不需要建立存储空间的。
例如:extern int a 其中变量a是在别的文件中定义的.前者是"定义性声明(defin ing declaration)"或者称为"定义(definition)",而后者是"引用性声明(referncing de claration)" 从广义的角度来讲声明中包含着定义,但是并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。
然而对于 extern a 来讲它只是声明不是定义。
一般的情况下我们常常这样叙述,把建立空间的声明称之为"定义",而把不需要建立存储空间称之为"声明"。
很明显我们在这里指的生命是范围比较窄的,也就是说非定义性质的声明例如:在主函数中int main(){extern int A; //这是个声明而不是定义,声明A是一个已经定义了的外部变量//注意:声明外部变量时可以把变量类型去掉如:extern A;dosth(); //执行函数}int A; //是定义,定义了A为整型的外部变量外部变量的"定义"与外部变量的"声明"是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。
系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。
对于外部变量来讲,初始化只能是在"定义"中进行,而不是在"声明"中。
c语言面试题目100及最佳答案精选全文

精选全文完整版(可编辑修改)c语言面试题目及最佳答案1、描述⼀下gcc的编译过程?gcc编译过程分为4个阶段:预处理、编译、汇编、链接。
预处理:头⼀件包含、宏替换、条件编译、删除注释编译:主要进⼀词法、语法、语义分析等,检查⼀误后将预处理好的⼀件编译成汇编⼀件。
汇编:将汇编⼀件转换成⼀进制⼀标⼀件链接:将项⼀中的各个⼀进制⼀件+所需的库+启动代码链接成可执⼀⼀件2、内存的最⼀存储单位以及内存的最⼀计量单位分别是?内存的最⼀存储单位为⼀进制位,内存的最⼀计量单位字节3、#include<> 与#include ""的区别?include<>到系统指定⼀录寻找头⼀件,#include ""先到项⼀所在⼀录寻找头⼀件,如果没有找再到系统指定的⼀录下寻找4、描述⼀下变量的命名规则变量名有字⼀、数值、下划线组成,但不能以数值开头5、变量的声明与定义有啥区别?声明变量不需要建⼀存储空间,变量的定义需要建⼀存储空间6、谈谈c语⼀中有符号和⼀符号的区别?有符号:数据的最⼀位为符号位,0表示正数,1表示负数⼀符号:数据的最⼀位不是符号位,⼀是数据的⼀部分7、谈谈计算机中补码的意义统⼀了零的编码将符号位与其他位统⼀处理将减法运算转换成加法运算8、谈谈数组的特点同⼀个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的9、数组的分类数组的分类主要是:静态数组、动态数组两类。
静态数组:类似int arr[5];在程序运⼀就确定了数组的⼀⼀,运⼀过程不能更改数组的⼀⼀。
动态数组:主要是在堆区申请的空间,数组的⼀⼀是在程序运⼀过程中确定,可以更改数组的⼀⼀。
10、描述⼀下⼀维数组的不初始化、部分初始化、完全初始化的不同点不初始化:如果是局部数组数组元素的内容随机如果是全局数组,数组的元素内容为0 部分初始化:未被初始化的部分⼀动补0完全初始化:如果⼀个数组全部初始化可以省略元素的个数数组的⼀⼀由初始化的个数确定11、谈谈数组名作为类型、作为地址、对数组名取地址的区别?数组名作为类型:代表的是整个数组的⼀⼀数组名作为地址:代表的是数组⼀元素的地址对数组名取地址:代表的是数组的⼀地址12、谈谈你对⼀维数组在物理上以及逻辑上的数组维度理解⼀维数组在逻辑上是⼀维的,在物理上是⼀维的13、描述⼀下函数的定义与函数的声明的区别函数定义:是指对函数功能的确⼀,包括指定函数名、函数类型、形参及其类型、函数体等,它是⼀个完整的、独⼀的函数单位。
c类的定义和声明

c类的定义和声明(原创版)目录1.C 语言的基本数据类型2.C 语言的变量和常量3.C 语言的运算符4.C 语言的控制语句5.C 语言的函数6.C 语言的数组和字符串7.C 语言的文件操作正文C 语言是一种高级计算机编程语言,广泛应用于操作系统、嵌入式系统、游戏开发等领域。
C 语言的定义和声明是编写程序的基础,下面我们将详细介绍 C 语言的基本概念。
1.C 语言的基本数据类型包括整型、浮点型、字符型和空类型等。
整型通常表示整数,浮点型表示小数,字符型表示单个字符。
2.在 C 语言中,变量和常量是用来存储数据的。
变量是可变的,常量是不可变的。
在声明变量时,需要指定变量的数据类型,例如:int a; double b; char c; 常量可以用 const 关键字来声明,例如:const int MAX_VALUE = 100;3.C 语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、赋值运算符和位运算符等。
运算符的优先级和结合性也需要掌握,例如:a + b 和 a * b 的优先级不同,需要用小括号来明确运算顺序。
4.C 语言的控制语句包括条件语句(if-else)、循环语句(for、while、do-while)和跳转语句(break、continue、goto)。
掌握这些控制语句,可以编写出更加复杂的程序。
5.函数是 C 语言中重要的组织代码的方式,可以实现代码的模块化和重用。
函数的声明和调用需要使用函数原型,例如:int add(int a, intb); int main() { int x = add(10, 20); }6.数组和字符串是 C 语言中常用的数据结构。
数组是一段连续的内存空间,可以存储多个相同类型的数据。
字符串是一段字符数组,通常用字符串常量或字符数组来表示。
7.文件操作是 C 语言中重要的功能之一,可以用来读写数据。
C 语言提供了 fopen、fread、fwrite 等函数来实现文件操作。
声明与定义的区别

什么是声明,什么又是定义?相信很多人都问过自己或别人这样的问题。
今天,我就发表一下我个人的一点小见解,希望对这两者有疑问的童鞋能理清他们的关系。
理解两者的区别之前,你要重新整理一下一些概念:1.C语言的对象,不管是什么,变量也好,函数也罢,他们都有且只能有一个定义,而声明却不同,理论上,只要你愿意,他们可以有任意多个声明,这就是为什么形如extern xxx xxx;能被同时包含到不同的头文件的原因(因为它是声明啊,彩旗飘飘,你懂的)2.声明只是告诉编译器说:“喂,编译器老兄啊,我是某某某的影子,你要找到他的话(编译时用到)去别处找啊,我只是他的影子哦”,所以请记住,声明时编译器并不会为声明的对象分配内存(有内存的话就不会是影子了,是吧),而定义时编译器会为定义的对象分配内存。
可能有人会问:那下面这种情况下哪一个是声明哪一个是定义啊???其实上面两个都是变量i的声明,他们会最终被保留在可执行文件的BSS段,编译器不会为其分配内存,可能又有人会问:“未初始化的全局变量不是都被编译器隐式地初始化为0吗,他们既然被隐式初始化为0,那也应该有相应的内存地址啊,怎么会都是声明呢?”有这样问题的童鞋很好,说明你已经对声明和定义的区别有所掌握了,不过事实是怎样的呢?事实上编译器不会为BSS段的数据(即未初始化的全局变量)分配内存,只是在BSS段上保留相应未初始化全局变量类型和名字的信息,好让系统运行可执行文件时能给未初始化全局变量分配内存并初始化为0。
所以呢,现在清楚了吧,未初始化全局变量是在程序执行时才真正被初始化的,故上面两个都是对量i的声明,而且声明的是同一个i(同一个内存地址),虽然说这样写编译器能接受,但是我强烈建议不要这样写,这是C语言的一个灰色地带,这样会给人感觉是两个变量,而其实他们是同一个,这样只会造成没必要的麻烦,也会让你将来维护这个程序时发疯的,如何避免命名冲突呢?对于其他文件不用引用到的全局变量,我们可以在定义全局变量时在类型名前面加上static关键字来避免命名冲突问题。
c语言函数的定义和声明

c语言函数的定义和声明C语言函数的定义和声明在C语言中,函数是一种可重复使用的代码块,用于完成特定的任务。
函数的定义和声明是使用函数的关键步骤,本文将详细介绍这两个概念及其使用方法。
一、函数的定义函数的定义是指为实现特定功能而编写的函数代码。
在函数的定义中,需要包括函数的名称、返回类型、参数列表和函数体。
1. 函数的名称函数的名称是用来唯一标识函数的符号,通常采用驼峰命名法或下划线命名法。
函数的名称应该具有描述性,能够清晰地表达函数的功能。
2. 返回类型返回类型指的是函数执行完毕后的返回值的类型。
C语言中常用的返回类型有整型、浮点型、字符型、指针型等。
在函数定义中,需要使用关键字来指定返回类型,如int、float、char等。
3. 参数列表参数列表指的是函数接收的输入值,也称为函数的形参。
参数列表中需要指定参数的类型和名称。
如果函数不需要接收任何输入值,可以将参数列表留空或使用void关键字表示。
4. 函数体函数体是函数的具体实现代码,包括了一系列的语句和逻辑。
函数体中的代码会在函数被调用时执行。
函数体应该包含必要的变量定义、循环结构、条件判断等,以实现函数的功能。
二、函数的声明函数的声明是指在使用函数之前,需要提前声明函数的存在和函数的原型。
函数的声明主要包括函数的名称、返回类型和参数列表。
函数的声明可以放在函数的定义之前,也可以放在其他函数的内部。
在声明函数时,只需要提供函数的名称、返回类型和参数列表,不需要提供函数体。
函数的声明可以放在头文件中,以便其他源文件可以引用该函数。
在需要使用该函数的源文件中,只需包含头文件即可。
三、函数的定义和声明的关系函数的定义和声明是相辅相成的,函数的声明使得我们可以在不知道函数具体实现的情况下使用函数。
而函数的定义则提供了函数的具体实现,使得函数能够被正确执行。
在使用函数之前,我们需要先进行函数的声明,以便编译器能够知道函数的存在和函数的原型。
然后再在合适的位置进行函数的定义,即提供函数体和具体的实现代码。
c语言中的变量

c语⾔中的变量⼀、变量种类:外部变量局部变量全局变量⾃动变量寄存器变量静态变量1)外部变量可以在全局范围内访问,因此函数间可以通过外部变量交换数据,⽽不必使⽤参数表;2)外部变量在程序执⾏期间⼀直存在;3)外部变量必须定义在所有函数之外,且只能定义⼀次,定义后编译程序将为它分配存储单元;4)在每个需要访问外部变量的函数中,必须声明相应的外部变量,说明其类型。
声明是可以⽤extern语句显⽰声明,也可以通过上下⽂隐式声明2. ⾃动变量(auto int a=8;)什么是⾃动变量:定义在函数体内部的变量,也叫私有变量或者局部变量。
作⽤域:仅限于定义它的函数体内部,函数中的每个局部变量只在函数被调⽤时存在,在函数执⾏完毕退出时消失。
3. 静态变量定义:以static存储类声明的变量。
static的两种声明:1)⽤static声明限定外部变量与函数,可以将其后声明的对象的作⽤域限定为被编译源⽂件的剩余部分。
通过static限定外部对象,可以达到隐藏外部对象的⽬的。
2)⽤static声明⾃动变量,声明后的对象的存储⽅式变为静态存储⽅式,它与⾃动变量的不同是,不管其所在的函数是否被调⽤,它⼀直存在,⽽不像⾃动变量那样,随着所在函数的被调⽤和退出⽽存在和消失4. 寄存器变量register int x;register char c;以上就声明了两个寄存器变量,register告诉编译器,它所声明的变量使⽤频率较⾼。
其思想是将register声明的变量放到机器的寄存器中,这样可以使程序更⼩、执⾏速度更快,但编译器可以忽略此选项。
注意:1)register声明只适⽤于⾃动变量及函数的形式参数;2)过量的register声明并没有什么坏处,因为编译器可以⾃动忽略过量或者不⽀持的寄存器变量声明;3)⽆论寄存器变量最终是否放到了寄存器中,它的地址都是不可以访问的。
5. 全局变量和局部变量在某些地⽅我们会看到全局变量和局部变量的定义,其实它们对应的就是外部变量和⾃动变量。
c语言语句声明

c语言中声明和定义的区别∙∙|∙浏览:426∙|∙更新:2014-01-16 09:41∙|∙标签:c语言之前一直搞不清楚声明和定义的区别,直到看了stackoverflow上的一篇文章。
看完之后,颇有所得,整理如下。
希望能帮到还在困惑的童鞋。
方法/步骤1.声明(declaration )指定了一个变量的标识符,用来描述变量的类型,是类型还是对象,或者函数等。
声明,用于编译器(compiler)识别变量名所引用的实体。
以下这些就是声明:extern int bar;extern int g(int, int);double f(int, double); // 对于函数声明,extern关键字是可以省略的。
class foo; // 类的声明,前面是不能加class的。
2.定义是对声明的实现或者实例化。
连接器(linker)需要它(定义)来引用内存实体。
与上面的声明相应的定义如下:int bar;int g(int lhs, int rhs) {return lhs*rhs;}double f(int i, double d) {return i+d;}class foo {};// foo 这里已经拥有自己的内存了,对照上面两个函数,你就应该明白{}的用处了吧?3.无论如何,定义操作是只能做一次的。
如果你忘了定义一些你已经声明过的变量,或者在某些地方被引用到的变量,那么,连接器linker是不知道这些引用该连接到那块内存上的。
然后就会报missing symbols 这样的错误。
如果你定义变量超过一次,连接器是不知道把引用和哪块内存连接,然后就会报duplicated symbols这样的错误了。
以上的symbols其实就是指定义后的变量名,也就是其标识的内存块。
4.总结如果只是为了给编译器提供引用标识,让编译器能够知道有这个引用,能用这个引用来引用某个实体(但没有为实体分配具体内存块的过程)是为声明。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。
而定义就是分配了内存。
对于下面的两句代码:
void Func()
{
int a;
int b=1;
a=0;
}
对于第一行代码,编译器不会做任何事,它不会为它在栈中分配一点东西,直到第三句,
a=0;时,编译器才会将其压入栈中。
而对于int b=0;这一句,编译器就会生成一条指令,为它赋值。
如果反汇编,看到的代码可能是这样的:
push 1;
push 0;
当然,并不一定编译器就会样做,也有可能在声明int a时,编译器就会把一个废值入栈,到第三条再为其赋值,这要看编译器的具体取舍,所以,声明不一定不是定义,而定义一定是定义。
但是,下面的声明,一定仅仅是声明:
extern int a;
这表时,有一个int变量a,它一定是在另外其他地方定义的,所以编译器此时一定不会做什么分配内存的事,因为它就是声明,仅仅表明下面的代码引用了一个符号,而这个符号是int类型的a而已。
变量的声明,其实就是一个空的东西,在C中就相当与一个空的指针,它什么也没有指向,没有任何实际的意义,例如int a。
而变量的定义,就不一样了,它是在内存中指定了一定的空间,一旦定义一个变量,系统自动给它分配一定的内存空间。
它是有一定的实际意义的。
例如int a=10。
两者区别:
声明不为变量分配空间,而定义为变量分配空间
因此同一个变量的声明可以出现多次,而只能定义一次
中函数的声明是可以重复的,但是变量却不可以。
对于变量的声明都会分配内存空间,只是这部分内存空间里存放的是随机值,直到被定义之后将赋予相应的值。