指针的艺术5——字符串与指针

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。


  1. strncpy
  2. strcat
  3. strncat
  4. strcmp
  5. strncmp

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'; 错误
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值