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

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

目录

 

关键字typedef

 关键字static

修饰局部变量

static修饰全局变量

用static修饰函数

总结:

register关键字介绍

 #define 定义常量和宏

指针

内存

指针变量的大小

结构体

定义结构体

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

 给结构体赋值

引用结构体变量


关键字typedef

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


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

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

#include
int 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的地址

#include
int 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再加一个. 然后选择所对应的结构体变量

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/584835.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存