关键字typedef
typedef类型重命名,例如:
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名,可以定义变量时候直接使用。
typedef unsigned int uint_32;
int main()
{
//num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}
关键字static
static 可以修饰局部变量
static可以修饰全局变量
static可以修饰函数
修饰局部变量
static修饰局部变量,可以改变变量的生命周期,使其延长,一直到程序结束,但是作用域不变,例如:
#include <stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
//代码2
#include <stdio.h>
void test()
{
//static修饰局部变量
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
通过上面两个代码段,我们可以很清晰的看到,代码1 调用函数test()时,为i开辟了一个空间,程序调用完后,空间释放,再次进入需要重新开辟;代码2调用test()时,也为整形i开辟一个空间,但是调用程序结束时,i的空间并没有释放,下次进入时,跳过开辟空间的这段代码,直接执行下一条语句。由此可见static修饰局部变量,可以改变变量的生命周期,使其延长,一直到程序结束。
修饰全局变量
首先需要明确的是,同一文件下,不同源文件之间的定义全局变量时,是具有外部链接属性的举个例子:
当我们在test.c中想使用 在add.c定义的全局变量g_val时,我们只需要在tset.c中 外部声明一下,就可以使用了。
当我们用,static修饰这个全局变量的时候,就会改变g_val这个全局变量的作用域,使其只具备内部链接属性。只能在本源文件内部使用。
修饰函数
其实修饰函数跟修饰全局变量是差不多的,当我们使用static修饰函数时候,它也只具备内部链接属性。例如:
static int Add(int x, int y)
{
return c+y;
}
//test.c
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
#define 定义常量和宏
当#define定义标识符常量时候,需要注意大写字母表示,例如:
#define MAX 1000;
在接下来使用常量1000时,都可以用我们定义的标识符 MAX 代替。
#define定义宏,例如:
// ADD是宏的名字,x,y是宏的参数,()是宏体
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
指针
想要了解指针,我们得先了解内存,程序运行时候会载入内存,程序中如果有数据需要存储也会开辟内存空间,例如我们在程序中定义一个整形变量时候,程序会为其开辟一个四个字节的空间 如下图所示:
在实践中,一个内存单元占用一个字节,当我们开辟完空间之后,我们如何查到这个空间呢,这就产生了地址,我们可以通过编号给每个地址进行有序的编号,也叫指针,就像生活中我们也是通过地址去寻找某个人一样,程序中的内存空间地址是怎么定义的呢,它会占据内存空间吗,用32位电脑举例,32位电脑有32根物理地址线,32根真实存在的线,通过通断电,让其产生高低电平,产生01的二进制数字信号,从而产生2^32次方个地址。
地址如何存储呢,这时候我们就需要定义指针变量例如:
int num = 10;
int *p;//p为一个整形指针变量
p = #
p用来存储指针(地址),所以p叫指针变量,因为指针指向的内容是整形,所以它的类型是int*型。我们可以通过解引用开改变地址里存储的变量 例如:
#include <stdio.h>
int main()
{
int num = 10;
int *p = #
*p = 20;
return 0;
}
当我们定义不同类型的指针变量之后,指针变量所占内存空间为多大呢,其实指针指向的都是各个变量的首地址,变量内部都是存储首地址的,我们知道地址是三十二位 也就是四个字节,所以不管什么类型的指针变量他的大小都是四个字节。
例如:
结构体
我们在定义年龄,身高,体重的时候,可以 用整形变量,双精度浮点型 在内存上开辟空间存储,但是我们想要描述一个人比如一个学生的信息时候,单独一种变量似乎无法满足,这时候就产生了结构体,结构体使得c语言有能力描述复杂的类型例如:
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
当我们把一个学生的信息用结构体表达完成后,我们也要对他进行初始化,这时候就用到我们上文提到的访问结构题操作符 . 和->例如:
//打印结构体信息
struct Stu s = {"张三", 20, "男", "20180101"};
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//->操作符
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps-
>id);