接着上次没说完的关键字咱们继续说。
1、关键字详解
1.1 关键字typedef
如果我没记错的话,上期我应该是写错了,因为这次敲起来感觉很陌生……以本期为准哈。
这个关键字是类型定义,我们可以理解他为类型重命名。
作用就是当我们定义类型名时会遇到较为麻烦的名字,比如 unsigned float ,这个类型名的含义是无符号的浮点型。
为了方便我们敲代码和这个代码的清晰整洁度,我们在main函数外部可以对 unsigned float进行一个新的命名,比如说就叫他 uflt,那么在后续的代码中,uflt就相当于unsigned float,具体使用情况如下:
typedef unsigned float uflt;
int main()
{
unsigned float a = 3.14; //和下面一个意思
uflt a = 3.14; //和上面一个意思
return 0:
}
因为我平时会看些篮球,就拿NBA球星扬尼斯. 西纳. 乌戈. 阿德托昆博来说,看到这个名字看球的和不看球的都沉默了吧,没错这就是字母哥的全名。
你说解说要是在开场进行双方球员首发球员介绍的时候,念字母哥的全名,“雄鹿这面的首发阵容扬尼斯……”,怕是念完了中场都休息了。
所以,为了方便我们就叫他字母哥了,那这个关键字其实作用就是这样的。
1.2 关键字static
1.2.1static修饰局部变量
static修饰局部变量称为静态局部变量,其实现的作用就是改变了局部变量的生命周期,即便出了作用域,还能存在,不会废除,知道程序结束,生命周期才结束。
我自己的理解就是把他看成一个有了全局变量生命周期的局部变量。
其本质是因为static修饰的局部变量存储的地方由栈区变到静态区,而得以实现延长生命周期,我们列举一段代码来体现它的实际意义:
#include
void test ()
{
int i = 0;
i++;
printf("%d ",i);
}
int main()
{
int i = 0;
for (i=0;i<10;i++)
{
test();
}
return 0;
}
// 这段代码的结果为 1 1 1 1 1 1 1 1 1 1 因为每次进入test循环后,i都重新定义为0,然后i++后变为1输出,出了test之后i=1自动销毁,i变为for里面的值。
#include
void test ()
{
static int i = 0;
i++;
printf("%d ",i);
}
int main()
{
int i = 0;
for (i=0;i<10;i++)
{
test();
}
return 0;
}
//这段代码的输出结果为 1 2 3 4 5 6 7 8 9 10 因为static修饰的变量i在保存在了test中,下一次再进入到test()中时,i调用上一次的值,所以实现逐次+1的效果。
1.2.2static修饰全局变量
在介绍这个之前,需要给大家补一点知识。
我们在创建一个项目的时候,一个项目里面可以包含一个或者多个源文件,项目是啥?源文件是啥?上菜图!
没错第一个是创建项目,第二个是创建源文件。
你会发现创建完一个源文件后还可以创建另一个源文件。
明白了这个,我们还要知道一个关键字——extern。
它的作用就是直接将其他源文件中调到自己的源文件中进行使用,比如一个源文件里面我们定义了一个int a = 1,我们在另一个源文件想要调用这个变量需要进行外部变量声明,extern int i 即可在其他源文件中直接引用变量i。
如果一个全局变量被static修饰,,那么这个全局变量只能在自己的源文件中使用,不能在其他源文件中使用,一旦强行在其他源文件进行外部变量声明,则会出现连接性错误。
同样的,static修饰一个函数时,效果和修饰全局变量的效果是一致的。
这里便不再详细说明,参考全局变量即可。
1.3 关键字#define
1.3.1 定义常量
当#define定义标识符常量时:
#define Min 100
//含义为 Min变量的值为100
1.3.2 定义宏
#define ADD(x, y) ((x)+(y)) //ADD 宏名;(x, y)中x、y为宏的参数,无类型;((x)+(y))为宏体,括号不能省略
#include
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0; }
//打印结果为5 50
实际就是将add加法函数通过宏定义来简便的进行了替换。
1.4关键字register
register是寄存器的关键字。
电脑中的存储设备有硬盘、内存、高速缓存和寄存器,空间逐次减小,造价逐次增大。
寄存器是最快的存储设备,register这个关键字就是建议电脑用寄存器来存储数据,但只是建议,具体由电脑决定。
2、指针
2.1 内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。
为了有效地使用内存,就把内存划分为一个个小的内存单元,每个内存单元的大小就是1个字节。
为了能够有效地访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
变量的创建需要在内存中分配空间,每个内存单元都有地址,所以变量也是有地址的,取变量地址的代码如下:
#include
int main()
{
int a = 0;
&a;//取出a的地址,这里a有四个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p",&a);//打印地址用%p
return 0;
}
2.1指针变量
地址在电脑中如何存储呢?这里就要引入一个新的变量——指针变量。
具体如何用指针变量来存储地址,如代码所示:
int a = 1;
int * p;
p = &a;
p就是一个整型指针变量,它里面存储的就是整型a的地址。
指针的使用实例:
#include
int main()
{
int num = 10;
int *p = #
*p = 20;
return 0;
}
//结果输出为20
p是一个指针变量,这里存放的是num的地址,通过解引用p即*p能够获取p指向的变量,从而通过更改*p而直接更改原变量的值。
除了整型指针变量同样还有char*、float*、double*等,用法同整型。
2.3 指针变量的大小
不论是整型还是字符型的指针变量,他的本质还是指针,是地址,所以所有的指针变量的大小都是一样的,在32位处理器下是4个字节,在64位处理器下是8个字节。
3、结构体
我们在之前学到的知识中,定义变量类型的时候只能是单一的类型,如果你要定义一个人的话,有姓名(char)、年龄(int)、身高(float)、性别(char),我们该怎么描述呢?这里就引入了结构体这一知识点。
struct Stu
{
char name[20];//姓名
int age; //年龄
float weight; //身高
char sex[5]; //性别
};
结构体初始化:
//打印结构体信息
struct Stu s = {"张三", 20, "170.3", "男"};
//.为结构成员访问 *** 作符
printf("name = %s age = %d weight = %.2f sex = %s\n", s.name, s.age, s.weight, s.sex);
//结构体名.结构体内变量名 来取出对应的信息。
//-> *** 作符
struct Stu *ps = &s;
printf("name = %s age = %d weight = %.2f sex = %s\n", ps->name, ps->age, ps->weight, ps- >sex);
//结构体地址->结构体内变量名 来取出对应的信息。
其实struct Stu的功能和int、float等都是一样的,只不过是struct Stu的中包含的类型比较复杂,总体的思路和传统的int、float等一样。
磕磕绊绊总算复盘完了,说的乱七八糟请各位谅解,下期见兄弟姊妹们!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)