文章目录
前言
10月1日是国庆节,但这天广东卫健委和澳门方面没有达成一致,封关政策延续,回家计划泡汤了,昨天在宿舍躺了一天好好休息了一下,今天则是去黑沙环那边逛逛,还吃了下澳门销量第一的螺蛳粉,虽然和正宗的比不了,也比其他家的好一点了。晚上想起没有复习C语言,便写下了这篇来回顾。
常量定义
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
定义常量的两种方式:
- 使用 #define 预处理器。
- 使用 const 关键字。
#define 预处理器
格式:
#define name stuff
name表示自己定义的常量的名称,命名规则和变量类似,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还可以用于宏定义,现在好像没学就不写。
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 (-215+1) |
INT_MAX | int 类型所能表示的最大值 | 大于等于 32767 (215-1) |
UINT_MAX | unsigned int 类型所能表示的最大值 | 大于等于 65535 (216-1) |
LONG_MIN | long int 类型所能表示的最小值 | 小于等于 -2147483647 (-231+1) |
LONG_MAX | long int 类型所能表示的最大值 | 大于等于 2147483647 (231-1) |
ULONG_MAX | unsigned long int 类型所能表示的最大值 | 大于等于 4294967295 (232-1) |
LLONG_MIN | long long int 类型所能表示的最小值 | 小于等于 -9223372036854775807 (-263+1) |
LLONG_MAX | long long int 类型所能表示的最大值 | 大于等于 9223372036854775807 (263-1) |
ULLONG_MAX | unsigned long long int 类型所能表示的最大值 | 大于等于 18446744073709551615 (264-1) |
数组
数组是存储一个固定大小的相同类型元素的顺序集合。
定义一个数组
type arrayName[size] // size cannot be variable
这叫做一维数组。arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C 数据类型。
初始化
我们定义了数组之后,可以逐个初始化数组,也可以使用一个初始化语句,例如:
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.
即求数组长度的时候和当做第一个地址使用时使用。
数组的输入与输出
数组的输入和输出也有不同的形式:
第一种,循环输入输出,一般用于知道长度的输入输出,一般是数字类的数组,通过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 实际长度,不含结束符号
后记
本篇讲的东西比较多,内容比较重要,需要反复实践才能记住。
Comments NOTHING