声明和定义的区别 赋值和初始化的区别

qq29992579 2010-01-05 10:21:09
请帮我解释一下 声明和定义的区别

还有赋值和初始化的区别

并加以举例说明
...全文
1266 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
shendu21 2010-11-09
  • 打赏
  • 举报
回复
引用性声明不分配存储空间,如extern int x; 只是告诉编译器x是整形,已经在其它地方定义了。
定义是在内存中确定变量的位置、大小。
初始化是定义变量时候赋给变量的值(从无到有)
赋值是以后用到该变量,赋给该变量新的值
int i;//定义
extern int i; //声明
int i=9;初始化
i= 7;// 赋值

变量定义与声明的区别
我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:
变量的声明有两种情况:
(1) 一种是需要建立存储空间的(定义、声明)。例如:int a在声明的时候就已经建立了存储空间。
(2) 另一种是不需要建立存储空间的(声明)。例如:extern int a其中变量a是在别的文件中定义的。
前者是"定义性声明(defining declaration)"或者称为"定义(definition)",而后者是"引用性声明(referncing declaration)"。从广义的角度来讲声明中包含着定义,但是并非所有的声明都是定义,例如:int a它既是声明,同时又是定义。然而对于extern a来讲它只是声明不是定义。一般的情况下我们常常这样叙述,把建立空间的声明称之为"定义",而把不需要建立存储空间称之为"声明"。很明显我们在这里指的声明是范围比较窄的,也就是说非定义性质的声明。
例如:在主函数中
int main()
{
extern int A; //这是个声明而不是定义,声明A是一个已经定义了的外部变量
//注意:声明外部变量时可以把变量类型去掉如:extern A;
dosth(); //执行函数
}

int A; //是定义,定义了A为整型的外部变量(全局变量)
外部变量(全局变量)的"定义"与外部变量的"声明"是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。
lovesi3344 2010-01-05
  • 打赏
  • 举报
回复
声明和定义的区别是

声明不为变量分配空间,而定义为变量分配空间

因此同一个变量的声明可以出现多次,而只能定义一次。

int *p,a = 5 ;这是声明,未分配空间,只告诉如何分配内存(如何:就是分配int型的内存)
int *p = &a; 这是定义,给指针分配空间。声明的同时赋值就叫定义,
*P = 10; 这是赋值

看到很多人乱回答我很气愤!
lovesi3344 2010-01-05
  • 打赏
  • 举报
回复
声明和定义的区别是

声明不为变量分配空间,而定义为变量分配空间

因此同一个变量的声明可以出现多次,而只能定义一次。

int *p,a = 5 ;这是声明,未分配空间,只告诉如何分配内存(如何:就是分配int型的内存)
int *p = &a; 这是定义,给指针分配空间。声明的同时赋值就叫定义,
*P = 10; 这是赋值

看到很多人乱回答我很气愤!
paulpeath 2010-01-05
  • 打赏
  • 举报
回复
韩弈风:
问题挺多呀!
int* p;
char* q;
都是定义指针。
paulpeath 2010-01-05
  • 打赏
  • 举报
回复
韩弈风:

int&a = x;// 声明a是x的引用 , a和x的地址值相同
如果a和x的地址相同 那么 a不就把x覆盖了啊。

不是覆盖,是两变量在内存地址相同。好比对于曹操,字孟德,您在称呼,曹操或曹孟德的时候是指同一个人,您在更改曹操的体重时,曹孟德的体重也同步变化;同样,您在更改曹孟德的学历时,曹操的学历也同步变化。

关键需要理解程序执行原理,不能机械的套概念

qq29992579 2010-01-05
  • 打赏
  • 举报
回复
指针什么时候 才叫做定义一个指针呢
hacker1125 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq29992579 的回复:]
初始化 我有点明白了 再解释一下 声明和定义  一定要 举例子
[/Quote]

///变量
int i;//定义
extern int i; //声明
//
int i = 0;//定义 + 初始化

int i=9;初始化
i= 7;// 赋值

//函数
//声明(一般放在*.h的头文件中)

int GetStringLen();


//定义(也就是实现体)
int GetStringLen()
{
。。。。、
。。。。
}


hacker1125 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq29992579 的回复:]
初始化 我有点明白了 再解释一下 声明和定义  一定要 举例子
[/Quote]

///变量
int i;//定义
extern int i; //声明
//
int i = 0;//定义 + 初始化

int i=9;初始化
i= 7;// 赋值

//函数
//声明(一般放在*.h的头文件中)

int GetStringLen();


//定义(也就是实现体)
int GetStringLen()
{
。。。。、
。。。。
}


hacker1125 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq29992579 的回复:]
初始化 我有点明白了 再解释一下 声明和定义  一定要 举例子
[/Quote]

///变量
int i;//定义
extern int i; //声明
//
int i = 0;//定义 + 初始化

int i=9;初始化
i= 7;// 赋值

//函数
//声明(一般放在*.h的头文件中)

int GetStringLen();


//定义(也就是实现体)
int GetStringLen()
{
。。。。、
。。。。
}


qq29992579 2010-01-05
  • 打赏
  • 举报
回复
那 int *p = new int;
书上还是 说是声明了一个*p存数一个int变量的存储空间啊 这里的 *p已经初始化了啊 怎么还叫声明一个指针啊 指针本身就要划分存储区域 而且还规定了大小类型 为什么还叫声明而不叫定义啊

那 指针 什么时候 才能是叫做定义一个指针呢
lovesi3344 2010-01-05
  • 打赏
  • 举报
回复
int a;
a如果是自动变量,而你又未赋值给它,系统将给它一个随机值,可能是垃圾值。
a如果是全局变量,而你又未赋值给它,系统将把它置为0.

int *p; 指针是保存变量地址的变量,未初始化的指针是个野指针,这个就是野指针,它声明了,但没初始化

[Quote=引用 21 楼 qq29992579 的回复:]
为什么 我在到的 int a;  都说是定义

而 我看到的 int *p;却是声明呢  2 个都划分空间 为什么叫法不一样呢
[/Quote]
qq29992579 2010-01-05
  • 打赏
  • 举报
回复
为什么 我在到的 int a; 都说是定义

而 我看到的 int *p;却是声明呢 2 个都划分空间 为什么叫法不一样呢
tanmeining 2010-01-05
  • 打赏
  • 举报
回复
看8楼的链接,对声明和定义就应该很清楚老
qq29992579 2010-01-05
  • 打赏
  • 举报
回复
int x = 56;
int&a = x;// 声明a是x的引用 , a和x的地址值相同

这是课本上的原话

请问引用是怎么在内存中划分空间的

如果a和x的地址相同 那么 a不就把x覆盖了啊
lovesi3344 2010-01-05
  • 打赏
  • 举报
回复
引用用的是同一块内存

[Quote=引用 16 楼 qq29992579 的回复:]
声明和定义呢  在内存中有什么不同
int x=56;
int& a = x; //声明了a是x的引用  为什么这里不是定义a是x的引用呢
[/Quote]
tanmeining 2010-01-05
  • 打赏
  • 举报
回复
声明是在编译时有用的,定义是要在运行时才用的,例如:

const char * getchar( unsigned int nLen );//编译时形成函数表中的一员
const char * getchar( unsigned int nLen )//定义,在栈区间开辟空间
{
char * pRet = NULL;//初始化,栈区间(局部变量区)
if (nLen != 0)
{
pRet = (char *)malloc( sizeof(char) * (nLen+1) );//在堆区间开辟空间
pRet[0] = '1';//赋值,堆区间
}
return pRet;
}

所以从上面的代码看来,赋值和初始化的区别,在内存中变化状态,还真不好说,有可能仅仅是换了内容,有可能连地址都换了,等等,具体问题要具体分析老~
qq29992579 2010-01-05
  • 打赏
  • 举报
回复
声明和定义呢 在内存中有什么不同
int x=56;
int& a = x; //声明了a是x的引用 为什么这里不是定义a是x的引用呢
ypb362148418 2010-01-05
  • 打赏
  • 举报
回复
一般来说变量都要有初始值,不然可能产生错误,这是为了安全设计的
qq29992579 2010-01-05
  • 打赏
  • 举报
回复
声明 和定义要是都 划分内存的话 那他们都有什么区别呢
davidstack 2010-01-05
  • 打赏
  • 举报
回复
问你一下3楼的,声明的时候不分配内存吗?在头文件中声明的变量应该占有内存吧。declaration是不赋值的,definition需要赋值。在C++的类中,初始化发生在赋值之前,常用的member initialization list就是初始化而已。
加载更多回复(12)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧