字符串
在 C 语言中,字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。声明和初始化创建了一个 字符串:
char charArrayName[capacity] = {charElement1,charElement2...}
其实,不需要把 null 字符放在字符串常量的末尾。C 编译器会在初始化数组时,自动把 '\0' 放在字符串的末尾。
C 中有大量操作字符串的函数(不止下表中列出的):
序号 | 函数 & 目的 |
---|---|
1 | strcpy(s1, s2); 复制字符串 s2 到字符串 s1。 |
2 | strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。 |
3 | strlen(s1); 返回字符串 s1 的长度。 |
4 | strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
5 | strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
6 | strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 |
结构体
C 中数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。
声明结构体和结构体变量
struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct structTag {
type1 attrVarName;
type2 attrVarName;
...
typeN attrVarName;
} structVarName1,structVarName2,...,structVarNameN;
在一般情况下,structTag(结构体标签(类名))、typei attrVarName;(成员属性定义)、objectvarNamei (实例化变量名(对象))这 3 部分至少要出现 2 个。
对声明进行下列举例说明:
//此声明声明了拥有3个成员(整型的a,字符型的b和双精度的c)并且没有标明其标签的结构体,声明了结构体变量s1。
struct
{
int a;
char b;
double c;
} s1;
//此声明声明了拥有3个成员并且标签命名为SIMPLE的结构体,没有声明结构体变量
struct SIMPLE
{
int a;
char b;
double c;
};
//用SIMPLE标签的结构体,另外声明了结构体变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
上述的两种声明中,SIMPLE声明的结构体变量和s1是两个完全不同的类型。
我们也可以用typedef关键字来创建一个新类型,其中,Simpler为创建的新类型名,随后可以用它来创建此类型的实例变量。示例如下:
typedef struct
{
int a;
char b;
double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,比如实现链表和树等数据结构。
1. 声明包含了其他的结构体
struct COMPLEX
{
char string[100];
struct SIMPLE a;
};
2. 声明包含了指向自己类型的指针
struct NODE
{
char string[100];
struct NODE *next_node;
};
3. 两个结构体互相包含,则需要对其中一个结构体进行不完整声明
struct B; //对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct A
{
struct B *partner;
//other members;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
struct A *partner;
//other members;
};
结构体变量的初始化
和其它类型变量一样,对结构体变量可以在定义时指定初始值。
访问结构成员
使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个英文句号;
结构作为函数参数
指向结构的指针
以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,语法如下:
//声明
struct structTag *structPointer;
//初始化
structPointer = &structVarName
使用指向该结构的指针访问该结构的成员时,请必须使用 -> 运算符。
//book为指向 Books类型的结构体变量book1 的 Books类型的结构体指针(指向变量的指针类型需和变量的类型相同)
void printBook( struct Books *book )
{
printf( "Book title : %s\n", book->title);
printf( "Book author : %s\n", book->author);
printf( "Book subject : %s\n", book->subject);
printf( "Book book_id : %d\n", book->book_id);
}
int main(){
struct Books Book1; /* 声明 Book1,类型为 Books */
/* Book1 成员初始化 */
//字符串成员变量使用strcpy初始化
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
printBook( &Book1 );
}
共用体
共用体是一种特殊的数据类型,允许在同一内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时刻只能有其中一个成员带有值。
定义共用体
使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:
union unionTag
{
member definition;
member definition;
...
member definition;
} one or more unionVariables;
unionTag ,unionVariables都是可选的。共用体占用的内存应足够存储共用体中最大的成员。
访问共用体成员
访问共用体的成员,我们使用成员访问运算符(.)。使用 union 关键字来定义共用体类型的变量,方法和struct相同:
union unionTag unionVar
所有的成员都能完好输出的前提是同一时间只用到一个成员,后初始化的共用体成员会覆盖之前初始化的。