2352 字
12 分钟
【C语言学习之路】第五节课——常量定义、数组以及基本字符串
2021-10-02
2024-01-13
c

前言#

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_MINint 类型所能表示的最小值小于等于 -32767(-2^15+1)
INT_MAXint 类型所能表示的最大值大于等于 32767(2^15-1)
UINT_MAXunsigned int 类型所能表示的最大值大于等于 65535(2^16-1)
LONG_MINlong int 类型所能表示的最小值小于等于 -2147483647(-2^31+1)
LONG_MAXlong int 类型所能表示的最大值大于等于 2147483647(2^31-1)
ULONG_MAXunsigned long int 类型所能表示的最大值大于等于 4294967295(2^32-1)
LLONG_MINlong long int 类型所能表示的最小值小于等于 -9223372036854775807(-2^63+1)
LLONG_MAXlong long int 类型所能表示的最大值大于等于 9223372036854775807(2^63-1)
ULLONG_MAXunsigned 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:

  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”。


后记#

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

【C语言学习之路】第五节课——常量定义、数组以及基本字符串
https://hoyue.fun/myc_5-2.html
作者
Hoyue
发布于
2021-10-02
最后更新于
2024-01-13
许可协议
CC BY-NC-SA 4.0
评论