目录
1. Typedef
1.#define和typedef的区别 (宏,关键字,预处理,编译,检查)
#define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。
typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用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. 三者的区别和联系:
typedef
、const
和#define
是C语言中的三种不同类型的关键字,它们用于定义常量、类型和宏。
-
typedef
用于定义自定义数据类型,可将一个已有的类型重新命名。可以使用typedef
定义多种自定义数据类型,如:typedef int Integer;
即将int
定义为Integer
类型。 -
const
用于定义常量,在程序执行期间该值不能更改。如:const int a = 10;
指定了变量a的值为10,编译器在编译时会将其视为常量,如果程序试图修改a的值,则会引发错误。注意,const
并不保证常量的值在内存中是不可修改的。 -
#define
也用于定义常量,但是它是一个预处理指令,它不像const
语句可以控制符号的作用范围,它定义的常量在整个程序中都有效,不需要再次声明就可以直接使用。如:#define MAX_NUM 100
将常量MAX_NUM定义为100。
虽然这些关键字都可以用来定义常量和类型,但它们在实现上有所不同。其中,const
定义的变量是分配在内存中的,它的值可以被编译器检查和限制;而通过#define
来定义常量,编译器只是进行文本替换,不会对常量进行任何检查。typedef
则是在语言层面上对类型进行定义,不应与常量混淆。