C语言笔录

  • 一,存储类
1,auto 存储类是所有局部变量默认的存储类。auto 只能修饰局部变量,如:auto int month;

2,register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小
(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。定义 'register' 并不意味着变量将被存储在寄存器中,
它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制

3,static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。

4,extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 'extern' 时,对于无法初始化的变量,
会把变量名指向一个之前定义过的存储位置。extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候
  • 二,位运算符
&:同时为1,就是1
|:有1,就是1
^:不同时为1,相同为0
~:取反,即0变成11变成0
<<:左移,n左移3,即n乘23次方:n*(2*2*2)
>>:右移,n右移3,即n除23次方:n/(2*2*2)
  • 三,运算符优先级
一元,+ - ! ~ ++ -- (type)* & sizeof 
条件,?: 
赋值,= += -= *= /= %=>>= <<= &= ^= |= 
上面这三种运算符顺序,从右到左
  • 四,杂项运算符
 ↦ sizeof & 三元
sizeof() :返回变量的大小。
& :返回变量的地址。
* :指向一个变量。
?: :条件表达式
%-3d :-3d表示左对齐,占3
  • 五,函数
每个 C 程序都至少有一个函数,即主函数 main()
函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。
  • 六,数组
double balance[10];//balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字
double salary = balance[9];//将把数组中第 10 个元素的值赋给 salary 变量
double balance[10];p = balance;//p 赋值为 balance 的第一个元素的地址
*(balance + 4) 是一种访问 balance[4] 数据的合法方式
PS:数组名是一个指向数组中第一个元素的常量指针,即:balance 是一个指向 &balance[0] 的指针
  • 七,输出的符
%a,%A 读入一个浮点值(仅C99有效)
%c 读入一个字符
%d 读入十进制整数
%i 读入十进制,八进制,十六进制整数
%o 读入八进制整数
%x,%X 读入十六进制整数
%s 读入一个字符串,遇空格、制表符或换行符结束。
%f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
%p 读入一个指针
%u 读入一个无符号十进制整数
%n 至此已读入值的等价字符数
%[] 扫描字符集合
%% 读%符号

无符号(unsigned)和有符号(signed)
exit(-1);//退出
%n 可以停止打印
  • 八,位域
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,
只有 01 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域""位段"
struct bs{
    int a:8;
    int b:2;
    int c:6;
}data;
说明 data 为 bs 变量,共占两个字节。其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 61,无名的位域是不能使用的
2,由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位
  • 九,共用体
共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,
但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。必须使用 union 语句
union Data
{
   int i;
   float f;
   char  str[20];
} data;
Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。
您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型
  • 十,位域

  • 十一, typedef

typedef 关键字,您可以使用它来为类型取一个新的名字
#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
  • 十二,文件读写
打开文件:FILE *fopen( const char * filename, const char * mode );
关闭文件:int fclose( FILE *fp );
写入文件:int fputc( int c, FILE *fp );或int fputs( const char *s, FILE *fp );
  • 十三,预处理器
#define:定义宏
#include:包含一个源代码文件
#undef:取消已定义的宏
#ifdef:如果宏已经定义,则返回真
#ifndef:如果宏没有定义,则返回真
#if:如果给定条件为真,则编译下面代码
#else:#if 的替代方案
#elif:如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif:结束一个 #if……#else 条件编译块
#error:当遇到标准错误时,输出错误消息
#pragma:使用标准化方法,向编译器发布特殊的命令到编译器中

宏延续运算符(\)
标记粘贴运算符(##)

#define tokenpaster(n) printf ("token" #n " = %d", token##n)
int token34 = 40;
tokenpaster(34);
打印token34 = 40

token##n则等于40。
  • 十四,从标准输入
<stdio.h>
gets(char *str) 从标准输入 stdin 读取一行,并把它存储在 str 所指向的字符串中
  • 十五,数据类型
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。
不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。在变量声明的时候,如果没有确切的地址可以赋值,
为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
  • 十六,标准库
<assert.h> -- 提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。
如:#define assert(ignore) ((void)0)
<ctype.h> -- 提供了一些函数,可用于测试和映射字符。
<errno.h> -- 文件定义了整数变量 errno,它是通过系统调用设置的,在错误事件中的某些库函数表明了什么发生了错误。
<float.h> -- 包含了一组与浮点值相关的依赖于平台的常量。这些常量是由 ANSI C 提出的,这让程序更具有可移植性。
<limits.h> -- 决定了各种变量类型的各种属性。定义在该头文件中的宏限制了各种变量类型(比如 char、int 和 long)的值。
<locale.h> -- 定义了特定地域的设置,比如日期格式和货币符号。
<math.h> -- 定义了各种数学函数和一个宏。在这个库中所有可用的功能都带有一个 double 类型的参数,且都返回 double 类型的结果。
<setjmp.h> -- 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值