5. 字符串 - 指针
5.1. 字符指针
5.1.1. 处理字符串
字符指针时指向 char 类型的指针变量,可以用于处理字符串(\0)和字符数组,读取、修改操作。
#include <stdio.h>
int main()
{
char str[] = "yqyz"; // 栈区且默认添加\0
char *p = str; // 定义字符指针指向栈区的字符数组首地址
*p = 'h'; // 正确,栈区允许修改
// 通过字符指针,访问字符数组中的字符
// 提示:有关字符串的循环,基本都是while 因为无需初始化语句
// while 循环能够更好的让程序员集中注意力思考“循环结束条件”
while (*p != '\0'){ // *p - p; '\0' -- '0'
printf("%c", *p); // %c - c%
p++;
}
//for( ; *p != '\0'; p++)
// printf("%c", *p);
puts("");
return 0;
}
代码中定义了字符数组 str,期中存储了yqyz\0;定义了字符指针 p 指向字符数组“首地址(首个元素地址)”。
通过字符指针与解引用操作符可以访问字符数组每个字符;
- 循环之前通过字符指针 p 修改字符串某个字符;
- 循环中通过字符指针 p 输出字符串每个字符,直到遇到
\0;
5.1.2. 作函数参数
字符指针做函数参数和整型指针做函数参数的使用方法相同,不同之处在于指向的内存地址类型和内存大小不同;
【作业】编写一个函数,合并两个字符串数组;
#include <stdio.h>
void myStrcat(char *dest, char *src)
{
}
int main()
{
char dest[100] = "abcdef";
char src[] = "123";
myStrcat(dest, src);
printf("dest: %s\n", dest);
return 0;
}
5.2. 带参主函数
int main(int argc, char *argv[])
argc(argument count):代表命令行参数的数量,./a.out本身就算 1 个参数;
argv(argument vector):命令行参数的字符串数组,每个数组元素都是 char * 类型;
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("argc: %d\n", argc);
for (int i = 0; i < argc; i++)
printf("%s\n", argv[i]);
return 0;
}
./a.out↙
argc: 1
./a.out
./a.out aaa↙
argc: 2
./a.out
aaa
./a.out aaa bbb ccc ddd↙
argc: 5
./a.out
aaa
bbb
ccc
ddd
最后一次运行程序时,一共指定了 4 个参数,加上 ./a.out 共 5 个参数,分别被存储到 main 函数的 argv 数组中。
argv 数组存储内容如下:{"./a.out", "aaa", "bbb", "ccc", "ddd"}。
5.3. 字符串操作函数
参考链接:https://cplusplus.com/reference/cstring/
size_t strlen ( const char * str );
接受一个字符指针 str,函数返回一个无符号整数代表字符串长度;
char * strcpy ( char * destination, const char * source );
从 source 拷贝字符直到遇到\0,然后将这些字符以及\0拷贝到 destination 所指向的位置,最终函数返回 destination 字符串首地址,失败返回 NULL。
strncpystrcatstrncatstrcmpstrncmp
int sprintf ( char * str, const char * format, ... );
str:表示要将格式化的数据写入到该数组中;
format:格式化字符串,用于指定输出的格式和要插入的数据,后面可以跟上要插入的数据,根据格式字符串的要求。
5.4. 字符串表示形式
字符数组char str[] = "yqyz";
C 语言中没有专门的字符串类型,通常是将字符串放在一个字符数组中。
字符数组归根结底还是一个数组,关于指针和数组的规则同样也适用于字符数组。
字符串常量char *ptr = "yqyz";
除了字符数组,C 语言还支持另一种表示字符串的方法,直接使用一个字符指针指向字符串;
字符串中的所有字符在内存中是连续排列的,字符串指针ptr指向的是字符串的第 0 个字符;通常将第 0 个字符的地址称为字符串的首地址。字符串中每个字符的类型都是char,所以ptr的类型必须是char *。
字符数组 - 字符串常量
字符指针看起来和字符数组的用法很相似,它们都可以使用%s输出整个字符串,都可以使用*或[ ]获取单个字符,但是这两种表示字符串的方式有致命的区别。
致命区别:字符串存储位置不同。
- 字符数组形式:存储在栈区(局部变量)或全局数据区(全局变量);
- 字符指针形式:存储在常量区;
内存中不同的存储区域,权限也不同:
- 栈区、全局数据区字符串(也包括其它数据)有读写权限;
- 常量区字符串(也包括其它数据)只有读取权限没有写入权限;
总结: C 语言有两种表示字符串的方法:字符数组、字符指针。它们在内存中存储位置不同,使得:
- 字符数组可以读取和修改;
- 而字符指针指向的字符串常量只能读取不能修改。
区分:
char str[] = "yqyz"; // 先在栈区或全局数据区开辟空间,然后放字符串
char *p = str; // 指针指向栈区或全局数据区字符串的首地址
*p = 'm'; 正确
char *p = "yqyz"; // 常量区有字符串,指针再指向它首地址
*p = 'm'; 错误
1699

被折叠的 条评论
为什么被折叠?



