变量类型
C语言根据变量作用域的不同,将变量分为局部变量和全局变量。
<1>.局部变量
1> 定义:在函数内部定义的变量,称为局部变量。形式参数也属于局部变量。
2> 作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。
<2>.全局变量
1> 定义:在所有函数外部定义的变量,称为全局变量。
2> 作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。
2,变量的存储类型
在C语言中根据变量的存储类型,变量可以分为:自动变量,静态变量,寄存器变量。
<1>,自动变量
1> 定义:自动变量是存储在堆栈中的。
2> 哪些是自动变量:被关键字auto修饰的局部变量都是自动变量,但是极少使用这个关键字,基本上是废的,因为所有的局部变量在默认情况下都是自动变量。
3> 生命周期:在程序执行到声明自动变量的代码块(函数)时,自动变量才被创建;当自动变量所在的代码块(函数)执行完毕后,这些自动变量就会自行销毁。如果一个函数被重复调用,这些自动变量每次都会重新创建。
<2>,静态变量
1> 定义:静态变量是存储在静态内存中的,也就是不属于堆栈。
2> 哪些是静态变量:所有的全局变量都是静态变量;被关键字static修饰的局部变量也是静态变量。
3> 生命周期:静态变量在程序运行之前创建,在程序的整个运行期间始终存在,直到程序结束。
<3>,寄存器变量
1> 定义:存储在硬件寄存器中的变量,称为寄存器变量。寄存器变量比存储在内存中的变量访问效率更高(默认情况下,自动变量和静态变量都是放在内存中的)
2> 哪些变量是寄存器变量:
a,被关键字register修饰的自动变量都是寄存器变量;
b,只有自动变量才可以是寄存器变量,全局变量和静态局部变量不行;
c,寄存器变量只限于int、char和指针类型变量使用。
3> 生命周期:因为寄存器变量本身就是自动变量,所以函数中的寄存器变量在调用该函数时占用寄存器中存放的值,当函数结束时释放寄存器,变量消失。
4> 使用注意:
由于计算机中寄存器数目有限,不能使用太多的寄存器变量。如果寄存器使用饱和时,程序将寄存器变量自动转换为自动变量处理
为了提高运算速度,一般会将一些频繁使用的自动变量定义为寄存器变量,这样程序尽可能的为它分配寄存器存放,而不用内存。结构体
/*
数组:只能由多个相同类型的数据构成
结构体:可以由不同类型的数据构成
*/
#include <stdio.h>
int main()
{
//1.定义结构体类型
struct Person
{ //里面的三个变量,可以成为是结构体的成员或者属性
int age;//年龄
double height;//身高
char *name;//姓名
};
//2.根据结构体类型,定义结构体变量
struct Person p = {20,1.82,"Tom"};
printf("年龄%d,身高%f,姓名%s\n",p.age,p.height,p.name);
//不按照结构体内的顺序写也可以,参考下面
struct Person p2 = {.name = "Tom",.age = 20,.height = 1.82};
printf("年龄%d,身高%f,姓名%s\n",p.age,p.height,p.name);
return 0;
}
结构体内存分析
#include <stdio.h>
int main()
{
return 0;
}
//补齐算法
void test1()
{
struct Student
{
int age;//4个字节
char *name;//8个字节
};
struct Student Stu = {20,"Tom"};
//补齐算法(对齐算法):结构体所占用的存储空间 必须是 最大成员字节数的倍数
int s = sizeof(Stu);
printf("%d\n",s);
//printf("%d,%s\n",Stu.age,Stu.name);
}
//结构体内存细节
void test()
{
//1.定义结构体类型(并不会分配存储空间)
struct Date
{
int year;
int month;
int day;
};
//2.定义结构体变量
struct Date d1 = {2011,4,10};//2个结构体互不影响,每个结构体有自己的空间
struct Date d2 = {2015,8,9};
//会将d1多有成员的值对象的赋值给d2的所有成员
d2 = d1;
printf("%d-%d-%d\n",d1.year,d1.month,d1.day);
printf("%d-%d-%d\n",d2.year,d2.month,d2.day);
}
结构体注意点
#include <stdio.h>
int main()
{
/*
这句代码做了两件事情
1.定义结构体类型
2.利用新定义好的类型来定义结构体变量
//定义变量的 第2种 方式: 定义类型的同时定义变量
struct Student
{
int age;
char *name;
double height;
}stu;
struct Student stu2;
*/
/*
//定义变量的一种方式
//1.类型
struct Student
{
int age;
char *name;
double height;
};
//2.变量
struct Student stu = {20,"Tom",1.82};
*/
return 0;
}
结构体作为函数参数:
将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参
#include <stdio.h>
// 定义一个结构体
struct Student
{
int age;
};
void test(struct Student stu) {
printf("修改前的形参:%d \n", stu.age);
// 修改实参中的age
stu.age = 10;
printf("修改后的形参:%d \n", stu.age);
}
int main(int argc, const char * argv[]) {
struct Student stu = {30};
printf("修改前的实参:%d \n", stu.age);
// 调用test函数
test(stu);
printf("修改后的实参:%d \n", stu.age);
return 0;
}
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------