初识C语言(4)

本文详细介绍了C语言中的typedef关键字用于类型重命名,以及static如何修饰局部变量、全局变量和函数,改变其作用域和链接属性。还探讨了#define用于定义常量和宏的作用,以及指针的概念,包括指针变量的大小。此外,还讲解了结构体如何组合单一类型以创建复杂类型。
摘要由CSDN通过智能技术生成

11.1关键字typedef

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

#include<stdio.h>
typedef unsigned int uint;
typedef struct Node
{
    int data;
    struct Node* next;
}Node;
int main()
{
    unsigned int num=0;
    unit num1=1;
//这里num与num1的类型是一样的,都是无符号整型,unit只是unsigned int的别名
    struct Node n;
    Node n2;
//同样这里n2与n的类型是一样的
    
    return 0;
}
//typedef可以把写起来不方便的类型给简化一下

11.2关键字static

在C语言中:

static是用来修饰变量和函数的

1.修饰局部变量——称为静态局部变量

2.修饰全局变量——称为静态全局变量

3.修饰函数——称为静态函数

11.2.1 修饰局部变量

 


#include<stdio.h>
void test()
{
    //未加static修饰局部变量
    //int a=1;
    //a++;
//注意a++是先执行后使用,但是我们所说的是在这条语句中,这条语句执行完就++了,所以打印出来的是2
    //printf("%d ",a)///2 2 2 2 2 2 2 2 2 2  2 3 4 5 6 7 8 9 10 11
    //加static修饰局部变量
    static int a=1;
    a++;
    printf("%d ",a)//2 3 4 5 6 7 8 9 10 11 
}

int main()
{
    int i=0;
    while(i<10)
    {
        test();
        i++;
    }
    return 0;
}
//不加static时,a出了大括号就被销毁,所以每次都会创建一次
//加static时,a不会被销毁,每次都使用上一次遗留下来的a

static修饰局部变量的时候,局部变量出了作用域,不会被销毁。本质上,static修饰局部变量的时候,改变了变量的存储位置,将栈区的局部变量放到了静态区,此时局部变量的生命周期为整个工程的生命周期,生命周期变长

 

11.2.2修饰全局变量

test.c中要想使用add.c中的g_val需要声明外部符号 

 b被static修饰后的全局变量会报错,此时这个全局变量不能再被test.c文件使用

全局变量时具有外部链接属性

static修饰全局变量的时候,这个全局变量的外部链接属性就变成内部链接属性。其他源文件就不能再使用这个全局变量了

11.2.3修饰函数

 函数也是具有外部链接属性的,所以同理,被static修饰后,外部连接属性就变成内部链接属性,其他源文件就无法使用了

 

数据早期都是cpu从内存中拿的

数据从寄存器中拿速度会更快,内存的数据往高速缓存中拿,高速缓存的数据往寄存器中拿,保证大部分数据在寄存器中都找得到,整体cpu的处理速度提升,效率变高

我们可以创建寄存器变量,但是这个变量要不要放到寄存器中还是由编译器决定的

#include<stdio.h>
int main()
{
    register int num =3;//建议将3放到寄存器中,这样访问3的速度更快一些 
    return 0;
}

12.#define定义常量和宏

//define 定义标识符常量
#define MAX 1000
//此时MAX的值就是1000,此时MAX是常量

//define定义宏
//宏是由参数的
#define ADD(x,y)((x)+(y))
#include<stdio.h>
int main()
{
    int sum=ADD(2,3);
    printf("%d "sum);//5
    return 0;
}

13.指针

13.1内存

指针类比生活中的房间,每个房间都有门牌号,通过这个门牌号能找到这个房间

内存划分为一个个的内存单元,每个内存单元都会有一个编号,一个内存单元的的大小是一个字节

 

 

创建变量的时候就是向内存中申请开辟一块空间

#include<stdio.h>
int main()
{
    int a=10;//向内存申请4个字节,存储10,a的地址是第一个字节的地址
    &a;//取地址操作符
    int* p=&a;
//将a的地址放到p中,这里*告诉我们p是指针,它的类型是int*,int说明p指向的对象是int类型的
//p就是指针变量,存放指针(地址)的的变量称为指针变量
    *p=20;//这里*是解引用操作符,意思就是通过p中存放的地址,找到p所指向的对象,*p就是p所指向的对象
    printf("%d\n",a);//20

    return 0;
}

 

 

 %p打印地址

 

13.2指针变量的大小

 指针变量的大小都是4/8个字节

不管是什么类型的指针,都是在创建指针变量,指针变量是用来存放地址的,指针变量的大小取决于一个地址存放的时候需要多大空间

32位机器上的地址:32bit位-4byte,所以指针变量的大小是4个字节

64位机器上的地址:64bit位-8byte,所以指针变量的大小是8个字节

14.结构体

结构体使C语言能描述复杂类型,把一些单一类型组合在一起的做法

 

#include<stdio.h>
void print(struct Stu *ps)
{
    printf("%s %d %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).tele); 
//也可以直接写为ps->name,它们是一样的
//结构指针变量->成员名

}
struct Stu//这个一个类型
{
    //成员
    char name[20];
    int age;
    char sex[10];
    char tele[12];
}
int main()
{
    struct Stu s={"zhangsan",20,"nan","12345678900"};//初始化,必须和前面一一对应
    printf("%s %d %s %s\n",s.name,s.age,s.sex,s.tele);
    //结构体对象.成员名
    print(&s);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值