c语言变量或函数的声明与定义(有实验)
在c语言中,变量和函数的声明:只是声明了一下,没有分配内存,声明可以多次。变量和函数的定义:给变量和函数分配了内存,定义只能是一次。有的资料介绍:int i;既可以是声明也可以是定义。extern int i;就只是声明。函数的声明与定义比较好区分
int func(int a, int b); 一般为函数的声明
int func(int a, int b) 一般为函数的定义
{
/*函数体*/
}
自己针对变量的声明和定义做如下实验:
如果int i既可以是声明也可以是定义,一个文件中有多个int i就报错。
实验(1)
源文件myext1.c
1 #include "my1.h"
2 #include "my2.h"
3 #include <stdio.h>
4 int main()
5 {
6 printf("i = %d\n", i);
7
8 return 1;
9 }
一个头文件 my1.h
int i;
一个头文件 my2.h
int i;
gcc编译
gcc -Wall myext1.c -o myext1
执行结果为: i = 0
myext1.c包含了两个头文件,就有两个int i;问什么没有报错呢?
是不是两个int i中,有一个是声明,有一个是定义,同时有对i进行了初始化,这样理解对吗?
实验(2)
将头文件my2.h修改为 int i = 2;其他的文件不变。
源文件myext1.c
1 #include "my1.h"
2 #include "my2.h"
3 #include <stdio.h>
4 int main()
5 {
6 printf("i = %d\n", i);
7
8 return 1;
9 }
一个头文件 my1.h
int i;
一个头文件 my2.h
int i = 2;
gcc编译
gcc -Wall myext1.c -o myext1
执行结果为: i = 2
是不是my2.h中int i = 2是既是声明有时定义,my1.h中的只是声明?
实验(3)
将头文件全部赋值
源文件myext1.c
1 #include "my1.h"
2 #include "my2.h"
3 #include <stdio.h>
4 int main()
5 {
6 printf("i = %d\n", i);
7
8 return 1;
9 }
一个头文件 my1.h
int i = 5;
一个头文件 my2.h
int i = 2;
gcc编译
gcc -Wall myext1.c -o myext1就报错
In file included from myext1.c:2:
my2.h:1: redefinition of `i'
my1.h:1: `i' previously defined here
在两个头文件中都做了定义所以报错,可以这样理解吗?
请问有关变量声明与定义的详细介绍。
c编译器在定义变量时,对变量初始化吗?
实验(4)
源文件myext1.c
1 #include "my1.h"
3 #include <stdio.h>
4 int main()
5 {
6 printf("i = %d\n", i);
7
8 return 1;
9 }
一个头文件 my1.h
int i;
gcc编译
gcc -Wall myext1.c -o myext1
执行结果为 i = 0
好像被初始化为0了。
实验(5)
源文件mydec.c
1 #include <stdio.h>
2
3 int main()
4 {
5 int i;
6 printf("i = %d\n", i);
7
8 return 1;
9 }
gcc编译
gcc -Wall mydec.c -o mydec
执行结果i = 11029664
好像没有被初始化为0呀。
实验(6)在源文件增加浮点型
1 #include <stdio.h>
2
3 int main()
4 {
5 int i;
6 float d;
7
8 printf("i = %d\n", i);
9 printf("d = %f\n", d);
10
11 return 1;
12 }
gcc编译
gcc -Wall mydec1.c -o mydec1
执行结果
i = 11029664
d = 0.000000
i好像没有被初始化为0
d被初始化为0了
为什么实验(4)i被初始化为0了,实验(5)没有被初始化为0,全局变量一般可以被初始化为0,但是局部变量没有被初始化为0,而是随机赋值?
实验(6)中,float d 被初始化为0,而int i没有,难道int i一般不被初始化?
请问有关c初始化详细的介绍。