C和指针 学习笔记

C语言中的 #if()和 #end if 用法

一种编译预处理指令

#if (表达式)
	...
#endif

1.#if 表达式 + 程序段 + #endif 形式

#if 表达式
程序段1
#else
程序段2
#endif
表示:如果表达式为真,则编译程序段1,否则编译程序段2.

2.#ifdef标示符 + 标识符 + #endif 形式
表示:如果标示符已经被#define命令定义过,则编译程序段。

#if defined a //如果定义了a则执行以下语句
#undef a //解除定义
#define a 200 //重新定义a
#endif 

3.#if 0/ #if 1 + #endif 形式
首先这里的0和1可以当做普通表达式来看待,1为真,0为假。
其次使用#if 0 有个很实用的方法就是当做注释来用。 有时候比用 // 和 // 整洁美观
比如用在调试代码的时候,code中定义的是一些调试版本的代码,此时code完全被编译器忽略。如果想让code生效,只需把#if 0改成#if 1

printf 格式%g

%g用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的0。即%g是根据结果自动选择科学记数法还是一般的小数记数法

printf("%g\n", 0.00001234);//1.234e-05

printf("%g\n", 0.0001234);//0.0001234

printf("%.2g\n", 123.45);//1.2e+02

printf("%.2g\n", 23.45);//23

对于指数小于-4或者大于给定精度的数值,按照%e的控制输出,否则按照%f的控制输出.

NUL和NULL的区别

NUL 是ASCII 字符集中 ‘\0’ 字符的名字,它的字节模式为全 0。NULL 指一个其值为 0 的指针。它们都是整型值,其值也相同,所以它们可以互换使用。然而,你还是应该使用适当的常量,因为它能告诉阅读程序的人不仅使用 0 这个值,而且告诉他使用这个值的目的。

符号 NULL 在头文件 staio.h 中定义。另一方面,并不存在预定义的符号 NUL,所以如果你想使用它而不是字符常量 ‘\0’,你必须自行定义。

NULL是一个宏,它在几个标准头文件中定义,0是一个整型常量,’\0’是一个字符常量,而NUL是一个字符常量的名字。这几个术语都不可互换。
1、NULL用于表示什么也不指向,也就是空指针((void *)0)
2、0可以被用于任何地方,它是表示各种类型零值的符号并且编译器会挑出它
3、’\0’应该只被用于结束字符串
4、NUL没有被定义于C和C++,它不应该被使用,除非你自己定义它,像:#define nul ‘\0’

getchar()

括号不用填任何值,它将会吧读取的一个字符做为返回值返回。如果输入中不再存任何字符,它将会返回常量EOF。
C可以把赋值操作蕴含于while语句内部,这样就允许程序员消除冗余语句。

常见字符函数和字符串函数

1.strcat

char* strcat(char* dest,const char* src)

功能: 字符串拼接
返回值:返回dest字符串起始地址
说明:

  • 源字符串必须’\0’结束
  • 目标空间必须可修改
  • strcat() 会将参数src字符串复制到参数dest所指的字符串尾部
  • dest最后的结束字符’\0’会被覆盖掉,并在连接后的字符串的尾部再增加一个’\0’
  • dest与src所指的内存空间不能重叠,且dest要有足够的空间来容纳要复制的字符串

2.strstr

char* strstr(const char* str,const char* substr)

功能:检索子串在字符串中首次出现的位置
返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL

3.strchr

char* strchr(const char* str,char c)

功能:查找字符串中第一次出现c的位置
返回值:返回首次出现c的位置的指针,如果s中不存在c则返回NULL

4.strrchr

char* strrchr(const char* str,char c)

功能:查找字符串中最后一次出现c的位置
返回值:返回最后一次出现c的位置的指针,如果s中不存在c则返回NULL

转义字符

\? 在书写连续多个问号时使用,防止它们被解释为三字母词。
\" 用于表示一个字符串常量内部的双引号。
\’ 用于表示字符常量’。
\\ 用于表示一个反斜杠,防止它被解释为-一个转义序列符。
\a 警告字符。它将奏响终端铃声或产生其他一一些可听见或可看见的信号。
\b 退格键。
\f 进纸字符。
\n 换行符。
\r 回车符。
\t 水平制表符。
\v 十垂直制表符。
\ddd ddd表示1~3个八进制数字。这个转义符表示的字符就是给定的八进制数值所代表
的字符。
\xddd 与上例类似,只是八进制数换成了十六进制数。

printf("%d ",'\40');//32
printf("%d ",'\x40');//64
printf("%d ",'\x100');//0,这里注意,因为''中的是一个字符,只能容纳1byte的数

变量的最小范围

在这里插入图片描述
在这里插入图片描述

宽字符常量(wide character literal)

宽字符是双字节多语言字符代码。
C中的宽字符基於wchar_t数据类型,它在几个头文件包括WCHAR.H中都有定义,如下:
typedef unsigned short wchar_t ;
因此,wchar_t数据类型与无符号短整数型相同,都是16位宽。
使用方法:
wchar_t c = ‘A’ 或:wchar_t c = L’A’ ;
可以不用写L,C编译器会对该字符进行扩充,使它成为宽字符

枚举类型.

1.枚举(enumerated)类型就是指它的值为符号常量而不是字面值的类型,它们以下面这种形式声明:

enum Jar_ Type { CUP, PINT, QUART, HALF_ GALLON,GALLON };

2.这条语句声明了一个类型,称为Jar_ _Type。 这种类型的变量按下列方式声明:

enum Jar_ Type milk_ jug, gas_ can, medicine_ bottle;

3.如果某种特别的枚举类型的变量只使用一个声明,你可以把上面两条语句组合成下面的样子:

enum { CUP, PINT, QUART, HALF_ GALLON, GALLON }milk_ jug, gas_ can, medicine_ bottle;

4.这种类型的变量实际上以整型的方式存储,这些符号名的实际值都是整型值。这里CUP是0,PINT是1,以此类推。适当的时候,你可以为这些符号名指定特定的整型值,如下所示:

enum Jar_ Type { CUP 二8,PINT = 16,QUART = 32,HALE_ GALLON = 64,GALLON - 128 } ;

5.只对部分符号名用这种方式进行赋值也是合法的。如果某个符号名未显式指定一个值,那么它的值就比前面一个符号名的值大1。

register
寄存器变量,编译器会将使用频率最高的变量自动设置为寄存器变量

链接属性

链接属性一共有3 种— external (外部)、internal(内部)和none (无)。
1.none
没有链接属性的标识符,总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的实体。

2.internal
intermal 链接属性的标识符在同一个源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。

3.external
属于extermal链接属性的标识符不论声明多少次、位于几个源文件都表示用一个实体。

关键字extern和static 用于在声明中修改标识符的链接属性。
1.static int b;
设置b为internal链接属性.
2.extern int b;
设置b为external链接属性.

存储类型

有三个地方可以用于存储变量:普通内存运行时堆栈硬件寄存器
1.static 静态变量
静态变量在程序运行之前创建,在程序的整个执行期间始终存在。
特征:在代码块之外谁给声明的变量;在变量的类型前面加上static
2.register 寄存器变量
机器会自动设置使用频率极高的变量放在寄存器里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值