问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言中,声明和定义有什么区别172

发布网友 发布时间:2023-11-16 02:09

我来回答

5个回答

热心网友 时间:2024-07-11 04:26

如果是指变量的声明和定义:

从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。
对于下面的两句代码:
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而已。

如果是指函数的声明和定义:

声明:一般在头文件里,对编译器说:这里我有一个函数叫function() 让编译器知道这个函数的存在。

定义:一般在源文件里,具体就是函数的实现过程 写明函数体。

热心网友 时间:2024-07-11 04:26

C语言里可能经常会说:

声明变量时不会分配内存,定义变量时才会分配内存。

局部变量的声明即是定义:

void fun(){
    int a = 1;  //既是声明,也是定义,初始值为1
    int b;      //既是声明,也是定义,初始值伪随机。
}

全局变量只能定义一次,可以声明多次,在全局变量不可见的地方但又想使用就得进行声明。

同一个文件中,比如main.c:

extern int a;   //声明,不再分配内存,extern关键字表示此变量已在其它地方定义。

void fun(){
    printf("%d\n",a);    //此处用到了全局变量a,而a是在后面定义,所以需要在前面再声明一次。
}

int a = 1;    //全局变量a定义,为它分配内存

int main()
{
    fun();
    return 0;
}

不同文件中:

fun.h:

void fun();   //函数声明

fun.c:

extern int a;   //声明,不再分配内存,extern关键字表示此变量已在其它地方定义。

//函数定义
void fun(){
    printf("%d\n",a);    //此处用到了全局变量a,而a是在另外一个源文件中定义,所以需要在前面再声明一次。
}

main.c:

#include "fun.h"

int a = 1;    //全局变量a定义,为它分配内存

int main()
{
    fun();
    return 0;
}

前面主要是针对变量的声明和定义的说明,当然也提到了函数的声明与定义。

函数和变量一样,使用前一定要先声明或者定义,定义本身也是一次声明。

//此处定义函数,有函数体,当然也是一次声明。
void fun(){
    printf("hello world\n");
}


int main()
{
    fun();   //fun函数在前面已经定义,所以可直接调用
    return 0;
}

另一例子:


void fun();//此处须声明一次(没有函数体),main函数才能调用它。

int main()
{
    fun();   //fun函数在后面定义。
    return 0;
}

//此处定义函数,有函数体,当然也是一次声明。
void fun(){
    printf("hello world\n");
}

热心网友 时间:2024-07-11 04:27

/*这是声明,只是告诉编译器
"在某处有一个名称为a,接受一个int类型的形参,没有返回值(void)"
的函数,并没有给出具体实现(实现可能在其它文件中)*/
void a(int a);
.................
//这是函数定义,提供具体实现
void a(int a)
{
.........

}
另外形如
int a=10;
这种属于"声明的同时定义"

热心网友 时间:2024-07-11 04:27

自己理解:

声明:全局定义。
定义:可以全局,也可以局部。

其实用一个简单的例子就可以看出区别;可以用一个例子 测试一下输出,就可以完全理解。

热心网友 时间:2024-07-11 04:28

声明就是告诉你有这么个东西,具体在哪你不用管。
定义就是这个东西就是这。
声明可以有很多个,定义只能且必须有一个。
就好像你这个人就是一个定义,我告别人说有你这个人,就是声明。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 求一些情侣头像,比较时尚的1 诈骗一个亿判多少年274 支付宝的蚂蚁花呗,我上个月用了分期付款还没还清,这个月又了花呗还 ... 玄机拆字,偷,可拆为何生肖2 怎么确保给100个人拍证件照,人和照片不会混淆! 女生读什么高中好? 非转基因油十大品牌 鱼缸生态棉用哪种最好 excel单元格里自动分成了两行,如何将第二行的内容提到第一... 用“……如……般……”怎么造句?66 仙人掌不去刺可以炖肉吃吗 一个女同事,她很漂亮,我虽然对她有意思,但我知道配不上,于是我故意疏远... 明天我直播上网课 我让他告诉他家里人小点声音 他告诉他妈的时... 学校网课上着没效果,有没有好的线上一对一推荐? 在C语言中,什么是声明、定义、初始化?有什么区别47 感冒勒能吃几种药?20 求情侣头像最好是没人用过的 或者很少人用过 酱油里有头发的成份吗? wxid开头的是什么意思 先锋式蒸发冷风扇 水是不是直接加水到水箱,冰晶盒是不是也直接放进去... 汽车分几种?1 你们来说说YunOS3.0的安全性怎么样呢? 鱼缸生态棉用哪种最好 俄料老油清沙枣青手镯好吗 鱼缸生态棉用哪种最好 鱼缸生化棉用粗孔和细孔那种好5 鱼缸生态棉粗,细哪种好2 鱼缸生化棉是粗空的好还是细孔的好12 聂耳长什么样子啊48 请根据聂耳这篇短文的内容简单的介绍聂耳5 身上长了小红点特别痒尤其是大腿内侧和阴毛处是怎么回事啊 感觉自己身边的人,离自己好远,世界上我到底该相信谁,依靠谁,... 求 非常好看特别的情侣头像 。 十万火急!!!2 怎么样设置无线路由器,本人电脑盲,尽量详细,谢谢 汽车的分类26 YunOS3.0的安全性怎么样? 关于“特立独行”的名言事列有哪些? 有用过YunOS 3.0系统手机的人么?觉得YunOS 3....2 如何区别“标新立异”与“特立独行”? 联合系统分区调频的特点