一、字符串
字符串:就是一串字符, 用英文双引号引起的一串字符
字符串的结束标志是“\0",不算做字符串的内容
注意:单引号引起来的单个元素是字符,
举个例子:
int main() { char arr1[] = "hello"; // 不定义数据的大小,C语言会根据后面给的字符串的大小设置这个字符数组的长度 char arr2[] = {'a','b','c'}; printf("arr1 = %s\n", arr1); printf("arr2 = %s\n", arr2); return 0; }
对于数组arr1 来说,存储的字符串“hello”,字符串有结束符是“\0“, 打印时遇到“\0“说明字符串结束了;
但是对于arr2 来说,存储的是3个字符,打印时要一直找到“\0“,才会结束,所以运行起来会有不符合赋值的情况,如下:
将arr2后面,添加“\0“,运行如下:
int main() { char arr1[] = "hello"; char arr2[] = {'a','b','c','\0'}; printf("arr1 = %s\n", arr1); printf("arr2 = %s\n", arr2); return 0; }
下面验证下“\0”不算作字符串的内容
strlen()是计算字符串的长度,需要引入头文件string.h
#include <string.h>
#include <stdio.h>
int main() { char arr1[] = "hello"; char arr2[] = {'a','b','c'}; // 随即值 char arr3[] = {'a','b','c','\0'}; int len1 = strlen(arr1); int len2 = strlen(arr2); int len3 = strlen(arr3); printf("len1 = %d\n", len1); printf("len2 = %d\n", len2); printf("len3 = %d\n", len3); return 0; }
结果:
二、转义字符---转变了原来字符的意思
比如要打印"\tests\test.c",\t不是一个、,一个t,表示的是一个制表符(tab),\t就是转义字符
三字母词:“??)”会被解析成 “]”
要实现??),需要\?\?\),来获得??)
举例1:打印一个单引号、一个双引号
int main() { printf("%c\n",'c'); //printf在打印数据的时候,可以指定打印格式,%c表示字符 printf("%s\n", "abc");//%s表示字符串 printf("%d\n", 100); printf("%c\n",'\'');// 转义单个单引号,否则前面2个单引号被看作一对,后面一个单引号无配对,报错 printf("%s\n", "\"");// 同上 return 0; }
结果:
举例2:\ddd跟\xdd
#include <stdio.h> int main() { printf("%s\n", "\130");// 8进制的130就是十进制的88,打印出来是X,X的ASCII 码值就是88
printf("%s\n", "\x30");// 0,value=48
return 0; }
总结:每个字符都有一个值,就是ASCII表中对应的ASCII值,
举例3: 求字符串的长度
#include <stdio.h> #include <string.h> int main() { printf("%d\n", strlen("c:\test\328\test.c"));//14,\t算一个字符,\32是一个八进制的(八进制不含8,所以8不算) }
三、注释---用来解释复杂的代码
注释://
四、操作符
源码取反,得到反码,反码加1得到补码
强制类型转换
关系操作符
逻辑与:
三目操作符举例:
五、其他基础
static修饰全局变量,改变了变量的作用域,让这个静态的全局变量只能在自己所在的源文件内部使用,出了源文件就没法使用了。
举个例子:
extern ----申明外部符号的。
add.c文件
test.c文件
上面的例子运行报错,因为add.c文件中的static修饰的全局变量的作用域是该源文件内部。
3.static修改函数
add.c文件中定义一个函数Add()
test.c文件中调用外部文件的函数时,首先要申明外部函数:extern 关键字 申明函数的返回类型 函数名(变量类型)
运行结果OK。
但是如果static修饰了了定义的函数,运行出错,无法解析该函数。
即:static修饰函数,也是改变了函数的作用域,即改变了函数的链接属性。
被static修饰的函数,外部链接属性就变成了内部链接属性。
#define 定义常量 和宏
1.#define定义常量
#define MAX 60 // 定义表示符常量MAX为60 int main() { int a = MAX; // 只要代码中用到了MAX,就是这里定义的60(未作任何修) return 0; }
2.#define 定义宏
①宏的概念:
在标识符的基础上加了一个参数。宏是带参数的
举个栗子:求2个数中的较大者
可以宏的定义更加简洁,不需要定义类型
32位-->有2的32次方 个 序列号,每个编号都对应一个内存块的话,该编号就是该内存块的地址。即32位的pc可以有2**32个地址。
一个内存单元表示一个字节