前言

10月1日是国庆节,但这天广东卫健委和澳门方面没有达成一致,封关政策延续,回家计划泡汤了,昨天在宿舍躺了一天好好休息了一下,今天则是去黑沙环那边逛逛,还吃了下澳门销量第一的螺蛳粉,虽然和正宗的比不了,也比其他家的好一点了。晚上想起没有复习C语言,便写下了这篇来回顾。


常量定义

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。

常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。

常量就像是常规的变量,只不过常量的值在定义后不能进行修改。

定义常量的两种方式:

  1. 使用 #define 预处理器。
  2. 使用 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的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 (-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 数据类型。

重要规则: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:

  1. Sizeof arrName
  2. 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结束。输出同理。

注意:数组名就是数组的首地址,指向该数组的第一个元素的指针,只不过是常量指针而已。所以不用再加取地址符。

关于&什么时候用的问题:

  1. 一般变量使用取地址符,是获取其地址,即为指向该变量的指针。
  2. 数组名就是数组的首地址,指向该数组的第一个元素的指针,只不过是常量指针而已。所以不用再加取地址符。
  3. 当数组指定在某一位置上读入某一个值时,需要取地址符。例如:把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”。


后记

本篇讲的东西比较多,内容比较重要,需要反复实践才能记住。

这里的一切都有始有终,却能容纳所有的不期而遇和久别重逢。
最后更新于 2024-01-14