明解C语言—初级篇-9~13章
字符串的基本知识
字符串字面量
用“ ”括起来的一系列字符成为字符串字面量。字符串最适合放在char数组中存储,字符串的末尾是首次出现的null字符(即为\0)。
字符串的读取
在字符数组变量名的前面不能加&运算符。
scanf函数将从键盘读取的字符串存储到数组时,会在末尾加上null字符。
数字字符出现的次数
大小写字符转换(函数方法)
项目 | toupper |
---|---|
头文件 | #include <ctype.h> |
原型 | int toupper(int c); |
说明 | 将小写字母转换成对应的大写英文字母 |
返回值 | 若c是小写英文字母,则返回转换后的大写英文字母,否则直接返回c |
项目 | tolower |
---|---|
头文件 | #include <ctype.h> |
原型 | int tolower(int c); |
说明 | 将大写字母转换成对应的小写英文字母 |
返回值 | 若c是大写英文字母,则返回转换后的小写英文字母,否则直接返回c |
非字符串的字符数组
如果字符串的长度超过数组的长度,这样的变量不看做字符串,看成是字符的集合,即为普通的数组。
指针
取不到地址的对象
对于使用register 关键字声明的寄存器对象,不能加上取址运算符&。因次,下述程序在编译时会报错。
#include <stdio.h>
int main()
{
register int x;
printf("%p\n",&x);
return 0;
}
指针和数组
指针和数组
1.数组名原则上会被解释成指向该数组起始元素的指针。
2.指针p指向数组中元素e时, p+i指向元素e后第i个元素的指针。
p-i指向元素e前第i个元素的指针。
3.数组名在以下两种情况下不会被视为指向数组首元素的指针
(1)作为sizeof运算符的操作数时,会生成数组整体的长度
(2)作为取址运算符&的操作数时,生成的是指向数组整体的指针。
指针运算符和下标运算符
1.指针指向数组中的运算e时,
指向元素e后的第i个元素为*(p+i),也可以写成p[ i ].
指向元素e前的第i个元素为*(p-i),也可以写成p[ -i ].
此时,如果p指向的是数组的首元素,那么指针p的行为就和数组a的行为相同。
2.注意事项:数组a的元素为n个时,元素为a[ 0 ]到a[ n-1 ],指向数组元素的指针为&a[ 0 ]到&a[ n ],为n+1个。
指针之间不可以做加法,但是可以做减法
数组和指针的不同点
赋值表达式的左操作数不可以是数组名,即不可以用赋值表达式改变指向数组起始元素的指针,但是左操作数可以是指针。
下标运算符[ ]的操作数
是一个双目运算符,其中一个操作数的类型是指向type型对象的指针,另一个操作数是整数类数据类型,生成值的类型是type型。
它的两个操作数的顺序是任意的,例如a[ 3 ]和3[ a ]是一样的效果。
数组的传递
传递数组时,如果形参定义时以数组的形式定义,它的本质仍然是指针,因此形参中指定的元素个数是没用的,无论是怎样的数值,都会被无视,因此我们传递数组时要另外传入数组的元素个数。
指针和字符串
用数组实现的字符串和用指针实现的字符串
char *ptr = "123";
ptr的初始值为字符串字面量" 123 ",同时也是指向该字符串字面量第一个字符的指针,占用字节数sizeof(ptr)+sizeof(“123”)字节,注意指针ptr不可进行如下声明:
char *ptr={'1','2','3','\0'};
共同点:使用下标运算符[ ],可以访问字符串的各个字符
ptr[0]='1';str[0]='1';//str是使用数组定义的字符串的数组名
不同点
可以为指向字符串字面量中的字符的指针附上别的字符串字面量,赋值后,指针指向新的字符串字面量中的字符。
字符串数组
char a[][5]={"LISP","C","Ada"};
char *p[]={"PULL","X","MAC"};
"用指针实现的字符串”的数组-----指针数组
指针p是元素类型为char*型,元素个数为为3的数组,数组各元素p[0],p[1],p[2]分别为指向各字符串字面量的首字符的指针。
占用字节数为sizeof§+sizeof(“PALL”)+sizeof(“X”)+sizeof(“MAC”)
可以使用p[ ][ ]来访问各个字符。
注意事项:用指针实现字符串初始化的时候无法保证各字符串字面量在内存空间是连续的。
通过指针操作字符串
对于指针实现的字符串,不要改写字符串字面量,也不要对超过字符串字面量的内存空间进行写入操作,如果要做到这些的话,可以用数组实现的字符串。
字符串处理库函数
strlen : 求字符串长度的函数,该函数返回不包括null字符在内的字符串长度
strlen(字符串)
strcpy :将s2指向的字符串复制到s1指向的数组中,返回s1的值
strcpy(char *s1,char *s2)
strcat : 连接字符串 ,将s2指向的字符串复制到s1指向的数组末尾,返回s1的值
strcmp : 比较两个字符串的大小,相等则返回0。
结构体
结构体
struct student{
char name[64];
int height;
float weight;
long schols;
}a,b;
student 是结构名,{ }中的是结构体成员,数据类型是struct student型。在声明的同时,也可以定义该类型的对象,例如代码中的a,b
结构体成员和 . 运算符
a.name表示结构体对象的成员,通过这种方式进行访问
声明结构体时所赋的初始值的形式是,将各个结构体成员的初始值依次排列在{ }里面,并用 , 分割,未被初始化的成员为0.
结构体成员和->运算符
->运算符: a->b 用指针访问结构体a中的成员b.
typedef
可以使用typedef声明为结构体赋上简洁的typedef名
typedef struct {
char name[64];
int height;
float weight;
long schols;
}Student;
相同类型的结构体可以相互赋值,如下代码所示,y的所有成员赋给了x中相应的成员。
struct student x, y;
x = y;
因此结构体可以作为返回值的类型