一、字符数组 与 字符串
char a[10] = {'a','b','c',...};
字符串:多个字符串在一起,用""括起来,以'\0'作为结束标志
1、一维数组
char a[10] = {"hello\0"};
puts(a);
gets(a);
2、二维数组
char a[3][10] = {"hello","world","China"};
puts(a[0]);
puts(a[1]);
puts(a[2]);
puts(&a[0][3]); -- 打印出"lo"
对于字符串,定义的时候如果没有初始化(清0),在后面赋值的时候一定要加上'\0',否则会出现乱码
如何去打印一维数组的字符串
1、puts(a);
2、printf("%s",a);
如何去打印二维数组的字符串
for(i = 0; i < 3; i++)
1、puts(a[i]);
2、printf("%s",a[i]);
二、字符串操作函数
1、strlen
头文件
#include <string.h>
格式
size_t strlen(const char *s);
功能
计算给定的字符串长度,不包括'\0'
参数
s -- 表示要求长度的字符串
返回值
给定字符串的长度,不包括'\0'
strlen 和 sizeof区别
(1)sizeof是一个关键字,strlen()是一个函数
(2)sizeof会计算'\0'
(3)sizeof()不能返回动态分配的内存空间大小
strnlen
size_t strnlen(const char *s, size_t maxlen);
功能:字符串实际个数 <= maxlen 返回字符串实际个数
> maxlen 返回maxlen
2、strcat
头文件
#include <string.h>
格式
char *strcat(char *dest, const char *src);
功能
将字符串src追加到dest的末尾
参数
dest -- 目标字符串
src -- 源字符串
返回值
返回追加之后的新的字符串dest的首地址
char *strncat(char *dest, const char *src, size_t n);
n -- 追加的最大字符数量
3、strcpy – 覆盖
头文件
#include <string.h>
格式
char *strcpy(char *dest, const char *src);
功能
将字符串src的内容拷贝到首地址为dest的空间
参数
dest -- 目标字符串
src -- 要复制的字符串
返回值
返回拷贝之后的新的字符串dest的首地址
char *strncpy(char *dest, const char *src, size_t n);
n -- 指定多少个字符复制过去
4、strcmp
头文件
#include <string.h>
格式
int strcmp(const char *s1, const char *s2);
功能
比较两个字符串大小,比较ASCII码,对位比较
参数
要比较的两个字符串
返回值
s1 > s2 返回大于0的数
s1 = s2 0
s1 < s2 返回小于0的数
int strncmp(const char *s1, const char *s2, size_t n);
n -- 指定比较的字符个数
5、strstr
头文件
#include <string.h>
格式
char *strstr(const char *haystack, const char *needle);
功能
检索子串在字符串首次出现的位置
参数
haystack -- 被检索的字符串
needle -- 要检索的子串
返回值
返回needle首次出现的位置,如果没有返回NULL
三、指针(地址) – 指针是一个变量
1、指针:<存储类型><数据类型> * <指针变量名>;
数据类型:<数据类型> + * --- 构成了一个新的数据类型
代表:指针所指向的数据的数据类型
初始化:
int a = 10;
int *p = &a;
p = &a;
指针变量:实际上也是一个普通变量,特殊在于里面存放的地址
(也有自己的内存空间)
如果指针变量没有赋值,它里面存储的是随机地址
2、指针的运算符 -- &(取地址) *(取内容)
int a = 10;
int *p;
p = &a;
*p = *(&a); ==> *p = a;
& 和 * 是互为逆运算
除了数组名以外,64位操作系统所有的地址用sizeof求大小得到的都是8个字节,32位是4个字节
3、指针的运算 -- 通过 间接访问 的形式,去操作原来的变量
int i = 10;
int *p = &i;
i = 5;
*p = 5;
int j = *p*10; --> j = i * 10;
4、指针变量的运算 -- 地址的偏移(一般用于数组)
非单独使用:
p++:先使用p中存放的地址,再向高地址位偏移一个数据类型单位
++p:先向高地址位偏移一个数据类型单位,再使用p中存放的地址
p+N:向高地址位偏移N个数据类型单位
p-N:向低地址位偏移N个数据类型单位
p-q:指针变量 - 指针变量 = 中间相差了多少个数据类型单位
5、特殊指针
(1)野指针:没有初始化 且 没有赋值的指针
可能会报段错误
段错误:非法访问内存
int *p;
printf("%d\n",*p);
(2)空指针:指向零地址空间的指针
一定会报段错误
int *p = NULL;
printf("%d\n",*p);
(3)空类型指针(void *) -- 可以存放任何类型的地址
注意:在使用的时候,一定要进行强转