前言
10月1日是国庆节,但这天广东卫健委和澳门方面没有达成一致,封关政策延续,回家计划泡汤了,昨天在宿舍躺了一天好好休息了一下,今天则是去黑沙环那边逛逛,还吃了下澳门销量第一的螺蛳粉,虽然和正宗的比不了,也比其他家的好一点了。晚上想起没有复习C语言,便写下了这篇来回顾。
常量定义
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
定义常量的两种方式:
- 使用 #define 预处理器。
- 使用 const 关键字。
#define 预处理器
格式:
#define name stuffname表示自己定义的常量的名称,命名规则和变量类似,stuff是常量的内容,意思为定义一个name、用stuff代替name。
例如:
#define reg register //将register替换为reg如果定义中的stuff非常长,它可以分成几行,但是除了最后一行之外,每一行的末尾都要加一个 ” \ ”
例如:
#define LOOP \for( int i = 0; i < 10; i++ ) \{ \sum += i; \if (i > 0) \prod *= i; \}注意 :#define的name和stuff之间为英文空格,单行结尾没有”;“,当定义为字符串时,用双引号,当定义字符时,用单引号
除此之外,#define还可以用于宏定义,现在好像没学就不写。
const 关键字
格式:
const type name = stuff;type表示定义常量的类型,和定义变量一样,可以是整数常量、浮点常量、字符常量,或字符串等。 后面像定义变量一样写,末尾加上”;”
即const关键字直接就是在定义变量前面加上const 。
例如:
const int LENGTH = 10;不同类型常量的不同规则
整数常量
整数常量可以是十进制、八进制或十六进制的常量。 前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
例如:
85 /* 十进制 */0213 /* 八进制 */0x4b /* 十六进制 */30 /* 整数 */30u /* 无符号整数 */30l /* 长整数 */30ul /* 无符号长整数 */浮点常量
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
例如:
3.14159 /* 合法的 */314159E-5L /* 合法的 */字符常量
字符常量是括在 单引号 中,例如,‘x’ 可以存储在 char 类型的简单变量中。 除了普通的定义字符常量,还可以定义转义序列码。 转义序列码在后面附页。
例如:
#define NEWLINE '\n'在表示中要像变量类似表示,例如:
printf("%c", NEWLINE);字符串常量
字符串常量是括在双引号 "" 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
很简单,例如:
#define HELLO "hello world"已定义的常量
在C语言中头文件 limit.h 中定义有几个常用的常量:
| INT_MIN | int 类型所能表示的最小值 | 小于等于 -32767(-2^15+1) |
|---|---|---|
| INT_MAX | int 类型所能表示的最大值 | 大于等于 32767(2^15-1) |
| UINT_MAX | unsigned int 类型所能表示的最大值 | 大于等于 65535(2^16-1) |
| LONG_MIN | long int 类型所能表示的最小值 | 小于等于 -2147483647(-2^31+1) |
| LONG_MAX | long int 类型所能表示的最大值 | 大于等于 2147483647(2^31-1) |
| ULONG_MAX | unsigned long int 类型所能表示的最大值 | 大于等于 4294967295(2^32-1) |
| LLONG_MIN | long long int 类型所能表示的最小值 | 小于等于 -9223372036854775807(-2^63+1) |
| LLONG_MAX | long long int 类型所能表示的最大值 | 大于等于 9223372036854775807(2^63-1) |
| ULLONG_MAX | unsigned long long int 类型所能表示的最大值 | 大于等于 18446744073709551615(2^64-1) |
数组
数组是存储一个固定大小的相同类型元素的顺序集合。
定义一个数组
type arrayName[size] // size cannot be variable这叫做一维数组。arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C 数据类型。
重要规则 :Array name represents the address of its first element, when an address is needed.当需要一个地址时,数组名称代表其第一个元素的地址。
初始化
我们定义了数组之后,可以逐个初始化数组,也可以使用一个初始化语句,例如:
int a[5] = {1,2,3,4,5};大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
我们可以省略掉了数组的大小,数组的大小则为初始化时元素的个数。例如:
int a[] = {1,2,3,4,5};数组名称的用法
根据书上解释,当使用数组名时:
usage of array name:
- Sizeof arrName
- When address is needed, it offers (be evaluated to) the address of its first element.
即求数组长度的时候和当做第一个地址使用时使用。
注意 :求数组长度包括:sizeof()和strlen()
数组的输入与输出
数组的输入和输出也有不同的形式:
第一种,循环输入输出,一般用于知道长度的输入输出,一般是数字类的数组,通过for循环,每次循环读入一个数,例如:
for(int i=1;i<=10;i++) scanf("%d",&a[i]);//此时a[i]不一定是第一位,需要取地址。表示循环输入10个数进入长度为11的数组a[]。 因为数组的第一位是0,所以到10就是11位。 输出同理,把scanf换为printf。
第二种,直接输入输出,一般用于字符串输入输出,例如:
char a[10];scanf("%s",a);//直接输入无法指定位置,默认以第一个元素作为位置,不用取地址符。表示直接读入一串字符,以\0结束。输出同理。
注意 :数组名就是数组的首地址,指向该数组的第一个元素的指针,只不过是常量指针而已。所以不用再加取地址符。
关于&什么时候用的问题:
- 一般变量使用取地址符,是获取其地址,即为指向该变量的指针。
- 数组名就是数组的首地址,指向该数组的第一个元素的指针,只不过是常量指针而已。所以不用再加取地址符。
- 当数组指定在某一位置上读入某一个值时,需要取地址符。例如:把5写到a[5]里。
字符串
在 C 语言中,字符串实际上是使用 null 字符 \0 终止的一维 字符数组 。在C语言中没有string类,只能定义为字符数组形式。
字符串定义
因为字符串是以’\0’结尾的字符数组,和普通的字符数组有一点区别。例如:
char word[5] = {'H', 'E', 'L', 'L', 'O'};这是定义了一个字符数组,存着字符”H E L L O”。
而字符串定义:
char word[6] = {'H', 'E', 'L', 'L', 'O','\0'};字符串以’\0’结尾,但我们在平时定义中不需要加上\0,例如:
char word[] = "HELLO";这行代码和Word[6]的这行代码等价,我们可以直接通过最后这种形式定义字符串。
字符串以 ‘\0’ 结尾,没有这个 null 的话不能使用 %s 格式控制符打印。
当定义字符串,并进行操作时,需要头文件 string .h 的支持,用#include<string.h>定义在开头。
字符串操作
| strcpy(s1, s2); 复制字符串 s2 到字符串 s1。 |
|---|
| strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。 |
| strlen(s1); 返回字符串 s1 的长度。 |
| strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
| strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
| strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 |
strlen与sizeof
strlen和sizeof都可以取到字符串的长度,但他们的实际意义不同。
strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等。
char a[] = "hello"; //定义一个字符串,系统自动为它加上了一个 '\0'int size = sizeof(a); // 6 真实容量,加上结束符号int len = strlen(a); // 5 实际长度,不含结束符号注意 :其实可以理解为:strlen()是求字符数组的长度,不包括”\0”。sizeof()是求字符串长度,包括”\0”。
后记
本篇讲的东西比较多,内容比较重要,需要反复实践才能记住。