一、常见关键字

 

 1)auto 自动的

     每个局部变量都是auto修饰的,基本上都是省略了

 int main(){

  auto int a = 10; // 局部变量,进入大括号自动创建,除了大括号自动销毁--自动变量

}

 

2)break/continue 用于for循环,while循环,swith

3)case,default: 用于swith 语句中

4) char/float/int/short/long

5) const 常变量, 不能修改的

6)enum 枚举

7)extern 是用来申明外部符号的

 

 全局变量在整个工程中都可以使用;

8)register 寄存器关键字

     register创建的变量,建议存放在寄存器中

     大量/频繁被使用的数据,想放在寄存器中,提升效率;

     int main(){

  register int num=100;//建议num放在寄存器中,只是建议,最终还是由编译器决定

}

扩展:计算机中的数据可以存储到哪里呢?

 

 CPU处理的数据需要去内存中拿

CPU处理速度快,但是内存的速度跟不上,也不行;

cpu去寄存器中拿数据,没有的话去高速缓存中拿,还没有再去内存中拿

 

 

9) signed 有符号的

数字是有正负的,signed表示描述的数字是有符号的

同理unsigned,表示无符号的

 

10)static 静态的

 static的3种用法:

 用法一、static修饰局部变量

 static修饰局部变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型)

void test()
{
    int a = 1;
    a++;
    printf("%d ", a);
}

int main()
{
    int i = 10;
    while (i < 10)
    {
        test();
        i++;
    }
    return 0;
}

结果输出10 个2;

将int a 修改为static 变量,如下:

void test()
{
    static int a = 1;
    a++;
    printf("%d ", a);
}

int main()
{
    int i = 10;
    while (i < 10)
    {
        test();
        i++;
    }
    return 0;
}

结果输出2,3,4,5,6,7,8,9,10,11

结论:static修改的局部变量,会从栈区存到静态区,除了大括号也不会消毁。程序不结束,全局变量跟static修饰的局部变量不会销毁。

 

 

 用法二、static修饰全局变量

static修饰全局变量,使得这个全局变量只能在自己所在的.c文件内部使用,出了该文件,不能被使用了。

如下:

 

 

 用法三、static修饰函数

static修饰函数之前:result=30

 

 增加static ,

static int add(int x, int y),报错!!

 

 

11)struct 结构体

12)union 联合体/共用体

13)void 无,空

14)typedef 类型重定义(重新起个名字/别名)

typedef unsigned int u_int; // 给unsigned int 取个别名叫做u_int

int main()
{
unsigned int num = 10; //定义一个无符号的int 变量
u_int num = 20; //用上面定义的别名,定义一个无符号的int 变量,跟直接定义unsigned int num=20是一个意思
}

 

15)volatile

 

Note: include 、define不是关键字,叫做预处理指令

 

二、函数

直接scanf输入两个数,计算2个数的和

#include <stdio.h>

int main() // 计算2个数的和
{
    int num1 = 0;
    int num2 = 0;
    scanf("%d%d\n", &num1, &num2);
    
    int sum = num1 + num2;
    printf("sum=%d\n", sum);
}

函数的方式调用2个数的和

#include <stdio.h>

int add(int x, int y)
{
    int z = 0;
    z = x + y;
    return z;
}

int main() // 计算2个数的和
{
    int num1 = 1;
    int num2 = 2;
    // int sum = num1 + num2;

    int sum = add(num1, num2);// 函数的方式
 
    printf("sum=%d\n", sum);//3
}

 

三、数组

定义:一组相同类型的元素的集合

举例:10个整形1-10存起来

1.数组的创建跟初始化

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//数组的创建和初始化

char ch[5] = {'a', 'b', 'c'}//不完全初始化,剩余的默认为0

 

2.数组的访问--下标(索引)

#include <stdio.h>

//数组
int main()
{
    int arr[3] = {1,2,3};
    char ch[10] = {'a','b','c'};// 不完全初始化,剩余的默认为0

    int i = 0;
    while (i < 3)
    {
        printf("%d\n",arr[i]);
        i++;
    }
    return 0;
}

 

四、关键字

 

五、指针

对于32位的计算机,32根物理线->通电->电信号转化成数字信号:1/0, 所以有2的32次方个编号可以给内存编号,0~2**32就是给每个内存单元的编号。

即:32个bit位的二进制序列组成的地址

同理:64位机器是64个bit位的二进制序列组成的地址

 

1.指针的使用

 

  

# include <stdio.h>


int main()
{
    int a = 10;
    char ch = "he";
    printf("%p\n", &a);//%p专门用lai打印地址的;
    //取地址a , a 是int,占4个字节,取的是第一个字节的地址;
    //pa=&a, pa是用来存放地址的,在C语言中pa叫做指针变量;* 说明pa是指针变量;int说明pa指向的对象是int类型的
    int* pa = &a;
    char* pc = &ch;
    printf("%p\n", pc);

    //pa中存的是a的地址,那么由pa肯定可以找到a的值
    *pa = 20;//*pa就是通过pa地址找到a的值,这个*叫做解引用
    printf("new a is %d\n", a);


}

 

2.指针的大小

int main()
{
    printf("%d\n", sizeof(char*));
    printf("%d\n", sizeof(short*));
    printf("%d\n", sizeof(int*));
    printf("%d\n", sizeof(long*));
    printf("%d\n", sizeof(long long*));
    printf("%d\n", sizeof(float*));
    printf("%d\n", sizeof(double*));

    return 0;
}

 

 指针的大小是相同的,64位机器的指针的地址都是8byte,

为什么指针的大小都是一样的呢?

指针是用来存放地址的,指针需要多大的空间,取决于地址的存储需要多大的空间。 

32位机器 32bit -->4 byte

64位机器 64bit --> 8 byte

 

 

六、结构体

#include <stdio.h>

// Define a struct Student
struct Student // Student 叫做结构体变量
{
    char name[10]; //结构体里面的成员,叫做成员变量
    int age;
    double score;
};

// Define a struct Man
struct Man
{
    char name[20];
    int  age;
    float height;
};



int main()
{
    // init a struct: s
    struct Student s={"zhangsan", 18, 97};
    struct Man m = {"xiaoming", 20, 175.5};
    
    // print+ 点 操作符
    printf("name:%s\nage:%d\nsource:%lf\n", s.name,s.age,s.score);
    printf("1:name:%s age:%d height%lf\n", m.name, m.age,m.height);//用到了 点 操作符, 访问成员变量的语法: 结构体变量.成员变量

    // print+ 指针 + 点 操作符
    struct Man * pm = &m;
    printf("2:name:%s age:%d height%lf\n", (*pm).name,(*pm).age, (*pm).height);//双精度浮点型用lf

    // print+ 指针 +  ->操作符
    //->操作符的语法:结构体指针->成员变量
    printf("3:name:%s age:%d height%lf\n", pm->name, pm->age, pm->height);

    {
        /* data */
    };
    
    return 0;
}