C语言变量定义与类型【局部变量、全局变量、形式参数】

变量详解【局部变量、全局变量、形式参数】

变量的定义

什么是变量?
  对于一般变量的解释,我们从字面意思上可以理解为允许对其值进行改变操作的量,是对某一对象值进行便于理解使用的名称。这么说可能有点不太明白,就比如说我们的身份证,在某种程度上就是一种变量,每一个身份证号(变量)都代表了一个确切的人(值),人可以有不同的发展,外界可以对其有不同的影响,但是一旦我们提到这个身份证号,那么便是唯一的指向这个本体。而在我们的C语言中,我们常将变量理解为内存中的一个命名的位置,存放一个可以被修改的值。

变量的定义即声明,在定义时一般遵循以下规则:

 type variable_list;

       其中type指的是带有任意修饰符的有效数据类型,variable_list是有一个或多个由逗号隔开的标识符名组成。什么是修饰符?(该内容在本文后方进行讲解。)

       例如以下定义均是合法的:

int a;
int a,b,c;
short int num;
long int b_num;

数据类型:

       常见的数据类型常用的有char、short、int、long、float、double六种,不同的数据类型所占内存大小不同,当然在不同的系统中对于不同数据类型分配的空间也是不同的,建议在不知道的情况下提前用sizeof测试一下。这里举一个例子:
例如在32位系统中在不同的系统上,
char——1 个byte位;
short ——2 个byte位;
int——4 个byte位;
long——4 个byte位;
float——4 个byte位;
double——8 个byte位。

修饰符

修饰符的存在可以用来改变基本数据类型的意义,以准确得对不同环境下的变量要求做出改变,常用的修饰符有:void(空)、signed(有符号)、unsigned(无符号)、long(长整型)以及short(短整型)。不同的修饰符所代表的数的类型不一样,以及其所占的空间大小、表示范围亦有所不同。这在对变量定义时以及对程序分析时一定要多注意。
【注意】
1.变量在使用之前一定要先进行声明(告诉大家有这个东西存在,且已经在内存的某处安家了,有事直接找它就行了)。
那如果我想直接使用会出现什么情况呢?举个例子:

num = 20;
	printf("%d", num);

那么这个时候你会发现程序是运行不下去的,且会提示你错误信息;

 error C2065: “num”: 未声明的标识符

2.同时,在同一个作用域里不能出现名字相同的变量(出现真假美猴王岂不是很麻烦),出现了相同的变量定义,程序会产生错误。例如:

	int a;
	int a;

这段代码就不符合正确的定义规范,编译器会对其进行报错:

error C2086:int a”: 重定义

3.在C语言中规定在一个程序中变量只能定义一次,但是却可以声明多次。

变量的分类

变量可以根据其声明所在位置及作用域的不同可大致分为三类:
在函数内部——局部变量
在函数参数的定义中——形式参数
在所有函数的外部——全局变量

局部变量

      局部变量是在函数内部声明的变量,变量如其名,它的作用域是局部性的,仅可以在被声明它的代码块的内部被使用,同时,该局部变量仅在进入其所在代码块时生成,在该区域代码块结束后便自动销毁。也就是说跑出这部分之后无论是重新定义还是其他种种均与该变量无关。代码块最显著的特征为——以左花括号开始,右花括号结尾的区域。
      ;例如以下程序:

void func1()
{
    
    
	int num1, num2,result;
	result = num1 + num2;
	
}
void func2()
{
    
    
	int num1, num2, result;
	result = num1 + num2;
}

以上两个函数中分别属于两个不同的代码块,因此,在func1中定义的变量num1、num2与result和func2中的局部变量并不冲突。在这里使用的时候,一定要注意在退出函数时,在函数中所定义的局部变量便会被立刻销毁,不能再直接使用。

形式参数

      在函数使用时,需要使用变元那就必须声明将接受变元值的变量。这种变量称为函数的形式参数,它的所有性质与局部变量大体相同,有所区别的是,它们的声明出现在函数名后的括号内。一般的形式参数只是对传入参数值的复制,使用该值,但并不对其本身地址中的址产生影响,这个是特别需要注意的;但如果使用的是指针类型的参数方可对地址进行操作,这里需要特别注意。
      例如以下代码,对变量a进行操作:

#include<stdio.h>
void func1(int a)
{
    
    
	a = 100;
}
int main()
{
    
    
	int a = 20;
	printf("a=%d\n", a);
	func1(a);
	printf("a=%d\n", a);
}

以上程序在运算输出发现其实a的值并没有改变,这便印证了前面所述,形式参数只是对传入变量值的复制并没有影响到变量本身。
输出如下:
在这里插入图片描述
而我们想要改变变量a的值该怎么做呢?参考下列程序:

#include<stdio.h>
void func1(int *p)
{
    
    
	*p = 100;
}
int main()
{
    
    
	int a = 20;
	printf("a=%d\n", a);
	func1(&a);
	printf("a=%d\n", a);
}

以上程序所传入的直接是地址变量的地址,是对地址中的值进行操作,故而可以改变。输出!如下:
在这里插入图片描述

【因此在操作时出现该类问题一定也要注意。】

全局变量

与局部变量相对,全局变量是在整个程序中都可以使用的,可以在任意的代码段所使用,同时在整个程序中其值都是唯一不变的。在使用时如果在代码段对全局变量进行重新定义或者复制,那么全局变量的值就会自动被隐藏,使用最近的那一组数据。例如以下程序:

int number = 100;
int main()
{
    
    
	int b;
	b = number;
	printf("%d\n", b);
}

在这个程序中,在main中并没有对number进行相关的定义,但是可以直接调用,该操作在程序的所有代码块都可以使用。输出如下:
在这里插入图片描述
除此之外还有以下情况:

#include<stdio.h>
int number = 100;
int main()
{
    
    
	int b;
	int number = 200;
	b = number;
	printf("%d\n", b);
}

在该程序下在main函数中重新定义了number变量,这时便采取就近原则使用本程序块中的number变量,全局变量自动隐藏。
实验结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/dream_i_success/article/details/109598723
今日推荐