> 文档中心 > 2500字,手把手带你初步了解static关键字和指针,结构体

2500字,手把手带你初步了解static关键字和指针,结构体

目录

 

关键字typedef

 关键字static

修饰局部变量

static修饰全局变量

用static修饰函数

总结:

register关键字介绍

 #define 定义常量和宏

指针

内存

指针变量的大小

结构

定义结构体

struct Stu为一个结构体类型,里面的为结构体变量

 给结构体赋值

引用结构体变量


关键字typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。

PS:就像一个人的小名一样,typedef是给变量类型安个小名

这里时给int类型重新安了一个小名叫a,即此时a等于int类型,我们可以用a来创建变量,并将它打印

#includeint main(){typedef int a; //类型重命名a i = 10;      //新名字来定义变量printf("%d", i);return 0;}

 关键字static

在C语言中: static是用来修饰变量和函数的 1. 修饰局部变量-称为静态局部变量

                                                                      2. 修饰全局变量-称为静态全局变量

                                                                     3. 修饰函数-称为静态函数

修饰局部变量

未使用static之前

使用static之后

我们发现,使用static之后,打印出的结果与之前有所不同,这是因为未使用static函数之前,每次打印完i之后,会把i的空间进行释放,当再一次进入的时候又会重新给i创建一个空间,并把i的初值赋为1,所以会打印10个1

使用static之后为什么能打印出1-10呢?

这是因为:static用来修饰局部变量时,会把局部变量放到静态区,此时每当打印完i后,即函数执行完后,静态区的i不会被释放,而回继续在这里保存着,当下一次再用到i时,i仍然以上一次出函数的值,作为初值,进行下一次操作

前面未使用static之前的i在每次函数执行结束后会立即被释放,是因为这个临时变量i创建在了栈区,一出函数就被释放,而static修饰后将i放到了静态区,延长了i的生命周期,使i的生命周期几乎和主函数生命周期一样长

static修饰全局变量

当我们在一个.c文件里创建了一个变量,并想在另一个.c文件里面使用时,我们要加extern来在要使用的.c文件里声明一下,才能加以使用

如下面这样:

这里我们在test1.c里创建了变量i,在test.c里使用变量i,并在test.c里面使用extern声明一下并使用

用static修饰外部变量之后

我们发现程序会报错

此时程序无法解析来自外部的变量i,但是我们在test1.c文件里使用i时却能正常使用

这是因为:用static修饰全局变量之后,它会将局部变量的外部链接属性变为内部连接属性,意思就是用static修饰全局变量之后,你想在另一个.c文件里面使用这个变量的时候,会使用不了。

用static修饰函数

在一个.c文件引用另一个.c文件的函数且未使用static之前

打印正常

使用static之后

此时无法正常打印

而我们在.c文件使用static之后

此时可正常打印

这是因为:当static修饰外部函数时,会使这个外部函数失去外部连接性,而保持内部链接性,因此才会报错

总结:

当static修饰局部变量时,该变量会被放到静态区,在每次使用完之后不会被释放临时变量所用的内存,生命周期会延迟到程序结束。

当static修饰全局变量和函数时,全局变量和函数会失去外部链接性,而保持内部链接性,因此当static修饰全局变量和函数时在另一个.c文件里会无法引用

register关键字介绍

register时寄存器关键字

  • register关键字只能作用于局部变量,不能作用于全局变量。
  • register关键字指明将局部变量存储于寄存器中。
  • register只是请求将这个变量存放到寄存器当中,但不一定能够请求成功

 #define 定义常量和宏

用define定义标识符常量

用define定义宏

注意:宏参数是无类型的

指针

内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地 址。

打印a的地址

#includeint main(){ int a=10;     //定义变量a,开辟四个字节的空间 int *c=&a;    //定义指针变量c,并将a的地址放入其中printf("%d",*c);      // 打印c地址中所1存放的数值printf("%p",c) //打印c的地址return 0;}

&a含义:取出a的地址,&为取地址符号

用int *类型定义一个变量将a地址里所存放的数字,赋值给int *类型的变量c,

int * c=&a含义,int 说明c指向的对象是int类型,*说明p是指针变量

不管是什么类型的指针,都是在创建指针变量 如 char *a就是一个指针变量

指针变量是用来存放地址的

指针变量的大小取决于一个地址存放的时候需要大多空间

指针变量的大小

指针变量的大小跟系统的操作位数有关。

 注:*c是指int *类型的变量c所在的地址中存放的变量。c是指以int *为类型的指针变量所指向的地址。

结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。 比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。 这里只能使用结构体来描述了。

定义结构体

这里电话用12个空间是因为,字符串里面\0也要占用一个空间

#include struct Stu{    char name[100]; //姓名    int age;  //年龄    char sex[10];    //性别    char tele[12]; //电话};

struct Stu为一个结构体类型,里面的为结构体变量

 给结构体赋值

赋值方法:分别按照所定义的结构体内的变量类型,按顺序赋予相应的值

struct Stu a是定义一个变量a a是结构体类型struct Stu

引用结构体变量

直接引用:用结构体变量a再加一个. 然后选择所对应的结构体变量

以指针的方式引用:用结构体名->进行应用