Typedef、 Const、#define三者的区别和联系

文章详细阐述了typedef、const和#define在C语言中的作用。typedef用于创建类型别名,const定义常量,不允许修改其值,而#define是预处理指令,做简单的文本替换,不进行错误检查。const修饰的变量在栈或只读数据段中,其值可以受制于指针类型。文章强调了三者在定义常量和类型时的异同,以及使用时的注意事项。

目录

1. Typedef

        2. Const

        3. #define

        4. 三者的区别和联系:


1. Typedef

1.#define和typedef的区别 (宏,关键字,预处理,编译,检查)

        #define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。

        typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。

注意#define和typedef定义指针的区别

#define myptr int* p

myptr a,b;//a是int * a, b是 int b

typedef int* myptr;

myptr a,b;//a是int * a, b是 int* b

补充:int *p,q表示p是指针变量,q是int变量

typedef int (*funtion)() //表示函数指针,重新命名为funtion

2. Const (C中的变量:局部,函数形成,返typedef回值,指针,typedef的区别,数组大小定义,case C++:常函数,常对象)

1.定义变量,表示该变量是个常量,不允许修改

例如:const int a=100;

错误:a=200;

2.修饰函数参数,表示函数体内不能修改该参数的值

3.修饰函数的返回值 const char getstr()

4.const修饰的常见:

Const int a;int const a;是一样的都是修饰变量a为常量

Const * int a ; int const *a ; 修饰的是这个指针指向的内容不允许修改,这个指针的地址可以改变 常量指针

Int * Const a; 修饰的指针,表示这个指针的地址不可以修改,地址的内容可以修改 指针常量

        Const int * const a;表示指针的地址不可以修改,内容也不可以修改

5.const修饰函数在c++的类中是不能Virtua虚函数

6.const n = 3;

假设 const n = 3; Int num[n] ={1,2,3 }  问是否正确?

错误:在c语言中n并不是真正意义上的常量,它还是变量 ,对于数组来说必须要开辟一个准确的数组大小,C++中是可以编译过去。

     int n = 3;

     int num[n] = {1,2,3};//这样也是错误的,数组必须是确定的

注意:如果数组不初始化是没有报错的

int n = 3;

    int num[n];

引申:switch case n:也是不可以的

所以在写代码的时候如果想要定义个常量最好是使用#define 而不要使用const

在C++类中有常函数的概念

比如在类中定义如下函数:

Void fun() const { }

像这种就是常函数,这种函数只能读取类中数据,不能修改

常对象

常对象只能调用常函数

const 修饰的变量存放位置

        对于const修饰的局部变量:存放在栈中,代码结束就会释放,在C语言中可以通过指针修改里面的值

        对于const修饰的全局变量(已初始化的)存放在只读数据段,不可以通过指针修改里面的值,未出示化的存放在.bss

3. #define

符号常量通俗地讲就是“替换”,即用标识符代替常量,又称为“宏定义”或“宏替换”。常量一旦确定其值,就无法改变。(末尾不加分号)
(1)替换常量:

格式如下:

    #define  标识符  常量

    eg:  #define  pi  3.14

(2)define 除了可以定义常量以外,可以定义任意的语句和片段

格式如下:

    #define  标识符  任何语句或片段

    eg:  #define  add(a,b)  ((a)+(b))

注意:不要写成(a+b)!

宏定义的陷阱:把括号里的内容直接原封不动的替换进去。
宏定义是直接将对应的部分进行替换,然后才进行编译和运行。

例如:

    #include <stdio.h>
    #define  cal(x)  (x*2+1)
    int main()
    {
      int a=1;
      printf("%d\n",cal(a+1));
      return 0;
    }

输出结果为4;而不是5;

因为a+1替换进去变为(a+1*2+1)即为4;

4. 三者的区别和联系:

typedefconst#define是C语言中的三种不同类型的关键字,它们用于定义常量、类型和宏。

  1. typedef用于定义自定义数据类型,可将一个已有的类型重新命名。可以使用typedef定义多种自定义数据类型,如:typedef int Integer;即将int定义为Integer类型。

  2. const用于定义常量,在程序执行期间该值不能更改。如:const int a = 10;指定了变量a的值为10,编译器在编译时会将其视为常量,如果程序试图修改a的值,则会引发错误。注意,const并不保证常量的值在内存中是不可修改的。

  3. #define也用于定义常量,但是它是一个预处理指令,它不像const语句可以控制符号的作用范围,它定义的常量在整个程序中都有效,不需要再次声明就可以直接使用。如:#define MAX_NUM 100将常量MAX_NUM定义为100。

        虽然这些关键字都可以用来定义常量和类型,但它们在实现上有所不同。其中,const定义的变量是分配在内存中的,它的值可以被编译器检查和限制;而通过#define来定义常量,编译器只是进行文本替换,不会对常量进行任何检查。typedef则是在语言层面上对类型进行定义,不应与常量混淆。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值