C语言第九天自学!----关键字( typedef+static)+ #define 定义常量和宏

一.关键字typedef

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

typedef是C/C++语言中用于创建类型别名的关键字。它可以帮助我们简化复杂的类型声明,并提高代码可读性。

typedef的基本语法如下:

typedef existing_type new_name;

其中,existing_type表示要创建别名的已存在的类型,

           new_name表示新的类型别名。

通过将existing_type和new_name结合在一起,并使用typedef关键字,就可以创建一个新的类型别名。

下面是typedef关键字的一些常见用法:

  1. 类型别名:可以使用typedef为现有的类型创建一个新的别名。例如:

    typedef int myInt;
    myInt num = 5;
    

    这里我们使用typedef为int类型创建了一个新的别名myInt,并将其用于定义变量num。

  2. 结构体别名:可以使用typedef为结构体类型创建一个新的别名。例如:

    typedef struct {
        int x;
        int y;
    } Point;
    
    Point p;
    p.x = 1;
    p.y = 2;
    

    这里我们使用typedef为一个匿名的结构体类型创建了一个新的别名Point,并定义了一个名为p的结构体变量。

  3. 函数指针别名:可以使用typedef为函数指针类型创建一个新的别名。例如:

    typedef int (*MathFunc)(int, int);
    
    int add(int a, int b) {
        return a + b;
    }
    
    MathFunc func = add;
    int result = func(1, 2);
    

    这里我们使用typedef为一个带有两个int参数并返回int的函数指针类型创建了一个新的别名MathFunc。然后,我们定义了一个名为add的函数,并将其赋值给func变量。最后,我们调用func函数指针,并将结果赋给result变量。

二.关键字static 

在C语言中: static是用来修饰变量和函数的

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

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

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

 ①修饰局部变量

代码一:

#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;
}

 

结果说明 i 生命周期只在作用域

代码二: 

#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修饰局部变量改变了变量的生命周期

----让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。

②修饰全局变量 

//代码1
 //add.c
 int g_val = 2018;
 //test.c
 int main()
 {
 printf("%d\n", g_val);
 return 0;
 }
 //代码2
 //add.c
 static int g_val = 2018;
 //test.c
 int main()
 {
 printf("%d\n", g_val);
 return 0;
 }

 代码1正常,代码2在编译的时候会出现连接性错误。

结论:

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使 用。

③修饰函数 

与全局变量底层逻辑类似

//代码1
 //add.c
 int Add(int x, int y)
 {
 return c+y;
 }
 //test.c
 int main()
 {
 printf("%d\n", Add(2, 3));
 return 0;
}

//代码2
 //add.c
 static int Add(int x, int y)
 {
 return c+y;
 }
 //test.c
 int main()
 {
 printf("%d\n", Add(2, 3));
 return 0;
 }

  代码1正常,代码2在编译的时候会出现连接性错误 

结论:

一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

三.#define 定义常量和宏 

定义常量的格式为:#define num  xxxx  (num为一个常量名,xxxx为定义的数值)

定义宏的格式为:#define ADD (x,y) ((x)+(y))   

----其中ADD是宏的名字,x 和y是可赋值的参数,最后的式子是其替换到代码的式子。

----在代码中使用ADD时,预处理器会将所有的ADD(a, b)替换为((x)+(y))  。

//define定义标识符常量
#define MAX 1000
 //define定义宏
#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);
 }
 

 需要注意的是,宏定义是简单的文本替换,没有类型检查和作用域限制。

ps:(网上抄的)在使用宏时,需要注意宏替换所带来的潜在问题,例如宏参数多次被计算、宏定义中的表达式产生副作用等。为了避免这些问题,可以使用括号来明确宏替换的优先级,或者使用内联函数来替代宏定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值