11.0关键字register(寄存器)
计算机上,数据都可以存储在哪里呢?
-
寄存器 字节
-
高速缓存xx M
-
内存 8G/16G
-
硬盘 500G
-
网盘 2T
越往上速度越快,造假越高,空间越小
CPU中央处理器
register int a=10建议编译器把a的值存在寄存器里
11.1关键字typedef
类型定义,可以理解为类型重命名
例:typedef unsigned int uint;可以把复杂的命名简单化
11.2关键字static(静态的)
三种用法:修饰局部变量
修饰全局变量
修饰函数
11.2.1修饰局部变量
内存:栈区:局部变量、函数参数、临时的变量(进入作用域创建,出了作用域就释放)
堆区:动态内存分配、malloc、callocc、realloc、free
静态区:静态变量、全局变量(放在静态区的数据创建后直到程序结束才释放)
int a=0/static a=0
#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;
}
#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;
}
普通的局部变量是放在栈区上的,这种局部变量进入作用域创建,出了作用域释放
但是局部变量被static修饰后,这种变量就放在静态区,放在静态区的变量,创建好后,直到程序结束才释放。
本质上:static的修饰改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样
被static修饰不影响作用域的!!!但是生命周期发生了变化,变长了。
11.2.2修饰全局变量
extrn//声明外部符号
全局变量本身是具有外部连接属性的,在A文件中定义的变量,在B文件中可以通过【链接】使用
但是如果全局变量被static修饰,这个外部链接属性就变成了内部连接属性,这个全局变量只能在自己所在的源文件内部使用
static的修饰,会把外部连接属性变成内部连接属性,最终使得全局变量的作用域变小了(即使有extern的声明也不行)
11.2.3修饰函数
函数本身是具有外部连接属性的,被static修饰后,外部链接属性就变成了内部连接属性,使得这个函数只能在自己所在的源文件内部使用,其他源文件无法使用。
限制了作用域
12.#define定义常量和宏
#define M 100
#define MAX(x,y)(x>y?x:y)
MAX宏的名字、(x,y)宏的参数、(x>y?x:y)宏体
13.指针
首先要理解内存
内存是计算机上的存储空间,8G/16G,程序运行的时候会载入内存, 程序中如果有数据需要存储,也会申请内存空间
如何有效使用内存:
在一个大厦中,一个门牌号(地址
)对应一个房间
内存单元的编号(地址)(地址也叫指针)
一个内存单元的大小是一个字节
如果访问一个内存单元,那内存单元的地址(指针)如何产生呢?
以32位机器为例:32根地址线,地址线如果通电
00000000000000000000000000000000 | 0 | 1字节 |
00000000000000000000000000000001 | 1 | |
00000000000000000000000000000010 | 2 | |
... | 3 | |
01111111111111111111111111111111 | 4 | |
10000000000000000000000000000000 | 5 | |
.. . | 6 | |
11111111111111111111111111111111 | ... |
一共产生2^32个这样的二进制序列,就可以作为2^32个地址,就可以管理2^32个内存单元,也就是2^32个字节的内存空间=4GB
编号=地址=指针
int a=1: //向内存申请4个字节
&a; //取地址操作符
//&a取出的是a所占内存的4个字节中第一个字节的地址
int * pa=&a; //pa是一个变量,用来存放地址的,而地址又叫指针,所以C语言中把pa叫指针变量(指针变量是存放指针的变量)
//*告诉我们pa是指针,pa指向的是int类型的变量
printf("%p\n",&a); 等价于printf("%p\n",pa);
进制只是数值的表示形式
*pa=20; //解引用操作,作用就是通过pa中的地址,找到a,*pa就是a
//a=20
指针:1.指针就是地址 2.口头语中指针一般指的是指针变量
13.2指针变量的大小
一个指针变量的大小是多少?
指针变量是用来存放地址的
32位机器上是32个bit位,指针变量存放的是32bit的地址,指针变量的大小是4个字节
64位机器上是64个bit位,指针变量存放的是64bit的地址,指针变量的大小是8个字节
x86是32位环境,x64是64位环境
14.结构体
C语言的内置类型
char
short
int
long
long long
float
double
人:姓名,性别,身高,体重,年龄...
书:书名,作者,出版社,定价...
复杂对象很难用一种类型名描述清楚
自定义的类型:
-
结构体
-
枚举
-
联合体
结构体的关键字:struct
定义一个学生类型
struct Stu
{
char name[20];
char sex[5];
int age;
}
int main()
{
int num=0;
struct Stu s={"zhangsan","男","20};
struct Stu s2={"如花","女","18};
print("%s\n",s2.name);
//结构体变量.成员名(访问结构体中的数据)
return 0;
}
//结构体的指针->成员名
void Print(struct Stu*ps)
{
printf("%s %s %d\n",(*ps).name,(*ps).sex,(*ps).age);
或者printf("%s %s %d\n",ps->name,ps->sex,ps->age);
}