C语言基础学习笔记(一)

1 篇文章 0 订阅

一个C程序结构

1.C语言由函数组成,有且只有一个主函数。
2.程序入口为main函数
3.return 0结束main()函数。
4.使用函数前,需要导入相应头文件,声明了函数
5. <>包含了预处理指令系统的头文件(标准头文件),“”包含了自定义的头文件,优先在指定路径检索。
6. 分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
7. 一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。

编译过程

1.预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,并不会检查代码语法错误
2.编译:检查语法,将预编译文件生成汇编文件
3.汇编: 将汇编文件生成目标文件(二进制文件)
4.链接: 将库链接到最终的可执行程序中
在这里插入图片描述
文件说明:

文件说明
.cC文件
.i预处理后的文件
.s汇编文件
.o编译后的目标文件

gcc、g++编译常用选项说明

参数说明
-o file指定编译后的文件名
-E只进行预处理
-S只进行预处理和编译
-s只进行预处理、编译和汇编

头文件说明

文件功能备注
stdio.hprintf()%lu 为32为无符号整数%E以指数形式输出单、双精度
stdlib.hsystem()
limits.hsizeof()
float.h有关实数二进制表示细节

系统函数

函数功能
printf()命令行界面输出结果
system()调用外部程序(可以执行系统命令)
sizeof()对象或类型的存储字节大小

数据类型

类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。

类型说明
基本类型也叫算数类型,整数类型、浮点类型
枚举类型也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量
void类型类型说明符 void 表明没有可用的值
派生类型指针类型、数组类型、结构类型、共用体类型和函数类型。

整数类型

类型存储大小值范围
char1 字节-128 到 127 或 0 到 255
unsigned char1 字节0 到 255
signed char1 字节-128 到 127
int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int2 或 4 字节0 到 65,535 或 0 到 4,294,967,295
short2 字节-32,768 到 32,767
unsigned short2 字节0 到 65,535
long4 字节-2,147,483,648 到 2,147,483,647
unsignedlong4 字节 0 到 4,294,967,295

类型的存储大小与系统位数有关。win系统相同,可以使用sizeof()得到对象或类型的存储字节大小

浮点类型

类型存储大小值范围精度
float4 字节1.2E-38 到 3.4E+386 位小数
double8 字节2.3E-308 到 1.7E+30815 位小数
long double16 字节3.4E-4932 到 1.1E+493219 位小数

void 类型

void 类型指定没有可用的值

序号 |类型与描述
1| 函数返回为空
C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status);
2| 函数参数为空
C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void);
3| 指针指向 void
类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。

变量

变量其实只不过是程序可操作的存储区的名称。也允许定义各种其他类型的变量,比如枚举、指针、数组、结构、共用体等等

变量定义

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,

变量声明

变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
除非有extern关键字,否则都是变量的定义。

extern int i; //声明,不是定义
int i; //声明,也是定义

C 中的左值(Lvalues)和右值(Rvalues)

C 中有两种类型的表达式:
左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边

常量

常量是固定值,程序执行期间不会改变,又叫字面量,可以是任何的基本数据类型,定义后不能修改。
字符串字面值或常量是括在双引号 “” 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。

定义常量

1.使用 #define 预处理器。
2.使用 const 关键字。格式: const int var = 5

转义序列码

转义序列含义
\\ 字符
’ 字符
"" 字符
?? 字符
\a警报铃声
\b退格键
\f换页符
\n换行符
\r回车
\t水平制表符
\v垂直制表符
\ooo一到三位的八进制数
\xhh . . .一个或多个数字的十六进制数

存储类

定义程序中变量/函数的范围(可见性)和生命周期。

auto

函数内部有效
auto 是所有局部变量默认的存储类,只能使用于函数内部

register

循环体中使用
定义存储在寄存器中而不是RAM中的局部变量。变量最大尺寸等于寄存器的大小,不能对它应用一元的‘&’运算符(&没有内存位置)。只能用于快速访问的变量比如计数器。并不意味变量将被存储在寄存器中,意味着变量可能存储在寄存器中,取决于硬件和现实的限制。

static

文件内有效
指示编译器在程序生命周期内保持局部变量存在,而不需要再每次它进入和离开作用域时进行创建和销毁。使用static修饰的局部变量可以在函数调用之间保持局部变量的值,修饰全局变量时,会使变量作用域限制在声明它的文件内。全局声明的一个static变量或方法可以被任何函数或方法调用,只要这些方法和static修饰的变量在同一文件中。
相当于在函数声明了变量,调用函数不会被初始化。

extern

各个源文件中有效,使用前需要使用extern声明
提供一个全局变量的引用,全局变量对所有程序文件都是可见的,无法初始化时,指向之前的定义存储位置
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数

C 语言中全局变量、局部变量、静态全局变量、静态局部变量的区别

从作用域看
1、全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。
2、静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
3、局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
4、静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
从分配内存空间看
1、全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间
2、全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2)变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。
Tips:
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带"内部存储器"功能的的函数)
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

位运算符

用于二进制运算

杂项运算符

运算符描述实例
sizeof()返回变量的大小。sizeof(a) 将返回 4,其中 a 是整数。
&返回变量的地址。&a; 将给出变量的实际地址。
*指向一个变量。*a; 将指向一个变量。
? :条件表达式如果条件为真 ? 则值为 X : 否则值为 Y

判断

判断语

语句描述
if 语句一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if…else 语句一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
嵌套 if 语句您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。
switch 语句一个 switch 语句允许测试一个变量等于多个值时的情况。
嵌套 switch 语句您可以在一个 switch 语句内使用另一个 switch 语句。

三元运算

条件 ? 为true返回 : 为false返回;

循环

循环类型

循环类型描述
while 循环当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。
for 循环多次执行一个语句序列,简化管理循环变量的代码。
do…while 循环除了它是在循环主体结尾测试条件外,其他与 while 语句类似。
嵌套循环您可以在 while、for 或 do…while 循环内使用一个或多个循环。

循环控制语句

控制语句| 描述
break 语句| 终止循环或 switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。
continue 语句| 告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。
goto 语句| 将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。

函数

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

return_type function_name(parameter list) {
	body
}

enum(枚举)

enum 枚举名 { 枚举元素1... };

定义枚举变量定义

1.先定义枚举类型,再定义枚举变量
2.定义枚举类型的同时定义枚举变量
3.省略枚举名称,直接定义枚举变量

指针

指针是一个变量,其值为另一个变量的地址

type *var-name;
int var = 20 //实际变量声明
int *y = NULL; //指针变量声明
y = &var //在指针变量中存储var变量的内存地址
*y //通过指针访问值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值