C语言关键字

本文深入探讨C语言中的关键字,包括宏定义中的#和##特殊用法,static、extern、register、auto、return、goto、struct、union、typedef、volatile等关键字的功能及应用场景,以及new、malloc的区别和变量作用域的详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言宏中“#”和“##”的用法:

1、“#“用法——字符串化宏定义输入参数

作用:当使用“#”修饰宏定义输入参数时,其本质就是将这个参数转化为字符串形式,且该修饰符必须在参数名之前。

如:

使用范例:

#define demo(input) #input

当使用上述宏定义时 ,如:demo(123)可以认为其返回一个字符串“123”,即将一个整数123转换成了字符串“123”,因此可以有如下使用: 

String str = demo(123); //String str = "123";

2、“##”用法——将宏定义的输入参数与其他字符组合成一个其他参数。

作用:这种方式就像是变量组合,但是组合后的变量必须是已经定义过的变量,且“##”的前后空格没有实际意义。

使用范例:

#define SUM(a,b) sum(a##1,b)          //a##1与a ## 1意义相同
int a,a1,b,c;
int main(void)
{
    c = SUM(a,b); //本质是c = sum(a1,b);
} 

结合变量名在程序编译阶段的作用,博主猜想这种使用方法的本质是在代码编译阶段编译器识别到“##”时会将前后两个字符组合成新的变量名,并且找到这个新的变量名的存储空间,并用这个存储空间的地址去替换这个组合参数名。

需要注意的是,如果两个组合的参数本身是一个宏的话,“##”会限制其展开,如下示例:

#define SUM(a,b) sum(a##1,b) 
SUM(SUM(a,b),b) //这个表达式并不会转为sum(sum(a1,b),b),而是会变成sum(SUM(a,b)1, b)

 C语言Static关键字的用法:(诺瓦、影石、大华

偷个小懒,自己之前整理过这个,博客链接如下:

C语言-static的用法_static在c语言中的用法-优快云博客

1.static是什么

  static在C语言中是关键字,中文直译过来是“静态的”static关键字在C语言中主要是用来修饰变量和函数。

static有三种不同的用法:

   1.修饰局部变量;

   2.修饰全局变量;

   3.修饰函数

局部变量:当函数第一被调用,函数中的静态局部变量被初始化,再次调用这个函数,这个 static 变量也不会再次被初始化,仍是保存的前一次函数调用时的结果。 (作用域不变,生存期改变)

全局变量: static 说明的全局变量只可以在当前 c 程序文件中使用(作用域收到限制,生存期不变)。

函数: static说明的函数只可以在当前 c 程序文件中使用 (作用域收到限制,生存期不变)。

内存大致上被划分为三个区域:栈区,堆区,静态区。

C语言-外部关键字extern :

自己之前整理过这个,博客链接如下:

C语言-外部关键字extern-优快云博客

extern 用在全局变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用。

什么是定义:所谓的定义就是为这个变量分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名。

什么是声明: 有两重含义,如下:
第一重含义: 告诉编译器,这个名字已经匹配到一块内存上了。
第二重含义: 告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名。记住,

定义和声明最重要的区别: 定义创建了对象并为这个对象一块内存,而声明的时候是没有分配内存空间的。

声明是不开辟内存的,定义是开辟内存的。

标准定义格式:extern 类型名 变量名;

extern int i; //是声明,不是定义,没有分配内存
int i; //是定义

4.16

C语言-new和malloc  

C++ new delete-优快云博客

做嵌入式,对于内存是十分在意的,因为可用内存有限,所以嵌入式笔试面试题目,内存的题目高频。
1.首先 new/delete 是 运算符 ,而 malloc 和 free 是函数
2.new 先为对象申请内存空间,让后再调用构造函数进行初始化,同理 delete
可以调用析构函数释放内存,而 malloc 只是申请内存空间并不能调用构造函数
进行初始化,同理 free 也只是释放内存
3.malloc 的返回值需要强转为自己申请的内存指针,而 new 不需要
4.malloc 需要指定申请内存的内存大小
1G 内存的计算机中能否 malloc(1.2G) ?为什么?( 2021 浙江大华二面问题)
答:是有可能申请 1.2G 的内存的。
解析:回答这个问题前需要知道 malloc 的作用和原理,应用程序通过 malloc 函数可以向程序的虚拟空间
申请一块虚拟地址空间,与物理内存没有直接关系,得到的是在虚拟地址空间中的地址,之后程序运行
所提供的物理内存是由操作系统完成的。

C语言-Sizeof()和 strlen()的区别:

1.Sizeof()和 strlen()的区别

C语​​​​​​言关键字sizeof 与strlen-优快云博客

     
 

C语言-联合体 union 和结构体 struct 的区别:

       对于联合体所有的成员都共享一块内存,而结构体是所有变量内存的叠加,需要考虑字节对齐问题,对于联合体来说,只要你修改里面的成员的数据就会修 改其他成员的数据,而结构体的成员数据是不影响的

C语言-++a和a++有什么区别?两者是如何实现的?

a++到底做了什么操作

a++是一组操作,它的过程是这样的(假设此时a的值为10):

  1. 获取到a的值,也就是10。
  2. 进行计算,也就是把获取到的值加一,得到计算后的结果,也就是11
  3. 把计算后的结果重新赋值给a,此时a为11
a++和++a的区别是什么

a++是进行上面讲的一组操作,这组操作执行完毕后返回之前取到的值,也就是10。

++a也是进行一组操作,只不过返回的是计算之后的值,也就是11。

使用技巧

可以把++看成一组操作,如果a写在++前,则表示返回计算前取到的值;如果a写在++后,则表示返回计算后的值。

 C语言-Volatile(编译优化阶段)

作用:告诉编译器该变量是容易发生变化的,不能对该变量进行优化,每次取 值都必须从内存中取值而不是直接去取之前在寄存器中的值

 C语言-Continue

语句的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可
以理解为仅结束本次循环。
注意: continue 语句并没有使整个循环终止。
只能用在循环语句

C语言-Break

只能用于循环语句或者开关语句
会使最近包含 break 语句跳出
在 while for、循环中 跳出本层循环
在 swich-case 中跳出对应的 case
如果 for(){switch case: break},for 循环不受影响
break 语句用在循环体中,可结束本层循环;
continue 语句用在循环体中,可 结束本次循环。

C语言-register

register的作用

如果一个变量用register来修饰,则意味着该变量会作为一个寄存器变量,让该变量的访问速度达到最快。例如,一个程序逻辑中有一个很大的循环,循环中有几个变量要频繁进行操作,这些变量可以声明为register类型。

C语言-Return

结束当前循环,退出函数,用在函数体中,返回特定值

C语言-Goto

无条件跳转

C语言-Struct(结构体) (C 和 C++区别,求结构体大小,使用的注意事项)

C语言之学习结构体_结构体类型的定义,结构体变量的定义和引用; 定义一个学生结构体类型, 包括整型的-优快云博客

C语言与c++中结构体之间的区别_c语言和c++结构体的区别-优快云博客

1. 在 c 语言中结构体是不允许有函数,在 c++中可以
2. C 语言结构体是不可以继承,c++可以继承
3. C语言中结构体的使用必须要用别名或者使用struct ,不能直接使用例如:
Struct
student
{
Int age;
Int num;
Inr sex;
}
Typedef struct student student;//必须得别名才可以使用
或者在使用的时候加上 struct,例如:
struct student student;
4. 访问权限不同
在 c 中默认是共有,不可以修改权限,在 c++中权限可以修改
5 .初始化
在 c 中不可以初始化数据成员,c++可以初始化
6.C++中空结构体大小为 1,C 为 0

C语言-class 和 struct 的区别

C++ 类的设计-优快云博客

1)继承权限:class 是默认 private,struct 是 public
2)访问权限:class 作为对象的实现体,默认是私有访问,而 struct 是作
为数据结构的实现体,是共有访问
3) class 可以用于定义模板,而 struct 不能

C语言-class 和 struct 的区别

里面的变量会自加

C语言-Typedef

C语言-typedef关键字_c语言常用关键字 typedef-优快云博客

typedef是在C语言允许为一个数据类型起一个新的别名。它本身是一种存储类的关键字,与auto extern,mutable、static、register 等关键字不能出现在同一个表达式中。

Typedef与define
       在单片机和操作系统中 typedef 会经常用到,它可以为某一个类型自定义名称。和#define比较类似。但是又有不同的地方。

   typedef 创建的符号只能用于数据类型,不能用于值。而#define 创建的符号可以用于值。
   typedef 是由编译器来解释,而不是预处理器。
   typedef 使用起来更加灵活。

   Typedef是起别名,define是替换。

C语言-Extern(链接阶段)

C语言-Auto

C++11 auto类型推导_c11自动类型推导-优快云博客

C语言-变量的作用域(全局变量和局部变量)

C语言由四种地方可以定义变量

在函数外部定义的是全局变量(这里的函数包括main函数)

在头文件中定义的是全局变量

在函数或语句块内部定义的是局部变量

函数的参数是该函数的局部变量

全局变量,在定义位置之后的任意函数都能访问.

存储的区别
全局变量存储在一个程序的data段中的静态数据区

局部变量存储在一个程序的data段中的栈区(stack),我们每定义一个局部变量,栈就会分配一块空间用来存储我们定义的局部变量

作用域的区别

作用域是指程序中被定义的变量存在(或生效)的区域,超过该区域变量就不能访问

局部变量的作用域仅限于定义这个变量的函数内部,在一个函数内部定义了,就不能在其它函数内部使用这个变量

#include<stdio.h>
void swap()
{
	int a = 10;  //在swap函数内定义一个局部变量a
}
int main()
{
	swap();
	printf("%d", a);//在主函数内部是不能使用的
 
}

全局变量的作用域是整个源程序,也就是整个工程文件,也就是谁说,定义了一个全局变量,这个变量不仅可以在多个函数内部使用,还可以在同一工程中的其它文件中使用!!(这一点太重要了)

#include<stdio.h>
int a = 10;  //定义一个全局变量a
void swap()
{
	printf("%d", a);
}
int main()
{
	swap();
	printf("%d", a);//在主函数内部是不能使用的
 
}

C语言-strcpy和strcmp、memcpy、strchr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值