字符串二级指针,妙用

在C中,字符串处理还是比较复杂的,不能直接赋值,除非是字符指针才能直接赋值。字符串通常是字符数组表示,字符数组还得用strcpy()才能赋值。

所以,在处理字符串的时候,经常会遇到二级指针。下面来总结一下自己学到的东西:

1. 字符数组和字符指针

把字符数组赋值给一个字符指针,直接赋值就可以,不需要在字符数组前加取地址符&。

2. 给字符数组赋值

不能直接用赋值符号’=‘,而是用strcpy()函数。

3. 指向字符指针的指针

char **char_pointer = &cell_content_char; 这是将二级指针指向字符指针的首地址;

而 *char_pointer则是字符指针所指向地址存储的值,而这个字符指针又是字符数组赋值而来的。因此cell_content, cell_content_char, *char_pointer 的值是一样的。

4. 给二级指针赋值

(*(*char_pointer)) = null; 此操作是将null字符赋值给char_point指针指向的首地址所储存的值,即用null取代cell_content_char和cell_content的首字符。

输出结果为由“i owe" -> "y owe"

5. 指针自增

(*char_pointer)++; 此操作是将指针往后移一位,即原来是指向字符串的首位,即字符'i'的位置,现在往后移一位,到' '所在的位置。注意,此指针移位,移的是cell_content_char,因为*(char_pointer)就是指向的cell_content_char,可以从两个指针变量的地址得知。

-> 注意和 (*(*char_pointer))++ 的区分!此操作无意义。

然后,又对二级指针赋值一次,那么此时字符'y'替代的是原本处于第二位的' '。

因此,cell_content_char的值变成'yowe',这也是*(char_pointer)的值。

而,cell_content的值,其第二位被改变了,其余地址保存的字符没有改变。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define cell_lenght 10

int main(void)
{

	char null = 'y';
	char cell_content[cell_lenght]; //字符数组
	char *cell_content_char = cell_content;//字符数组赋值给字符指针
	char **char_pointer = &cell_content_char;
	//cell_content_char = "i love";
	printf("default value.\n");
	strcpy(cell_content, "i owe");
	printf("cell_content_char = %s, add = %p.\n", cell_content_char, cell_content_char);
	printf("cell_content      = %s, add = %p.\n", cell_content, cell_content);
	printf("*char_pointer     = %s, add = %p.\n", *char_pointer, *char_pointer);
								// char_pointer是指向cell_content_char的指针,保存的是其首地址。
								// *char_pointer      是cell_content_char字符串的值
						
	printf("starting 1st eval test.\n");
	(*(*char_pointer)) = null;  //替换cell_content_char字符串的首字符

	printf("*char_pointer     = %s, add = %p.\n", *char_pointer, *char_pointer);
	printf("cell_content_char = %s, add = %p.\n", cell_content_char, cell_content_char);
	printf("cell_content      = %s, add = %p.\n", cell_content, cell_content);

	printf("starting 2nd eval test.\n");
	(*char_pointer)++;         //将cell_content_char指针移到下一位,(*char_pointer)指的是cell_content_char字符指针和cell_content字符串数组,
								//即指向了cell_content字符串数组"i owe"的第二位 space
	(*(*char_pointer)) = null; //替换cell_content字符串数组第二位空格为null
								//由于指针移到第二位了,所以*char_pointer和cell_content_char的首地址为第二位。
								//cell_content第一位不变,而是第二位插入了null
	printf("*char_pointer     = %s, add = %p.\n", *char_pointer, *char_pointer); 
	printf("cell_content_char = %s, add = %p.\n", cell_content_char, cell_content_char);
	printf("cell_content      = %s, add = %p.\n", cell_content, cell_content);

	return 0;
}

打印结果:

default value.
cell_content_char = i owe, add = 008FF70C.
cell_content      = i owe, add = 008FF70C.
*char_pointer     = i owe, add = 008FF70C.
starting 1st eval test.
*char_pointer     = y owe, add = 008FF70C.
cell_content_char = y owe, add = 008FF70C.
cell_content      = y owe, add = 008FF70C.
starting 2nd eval test.
*char_pointer     = yowe, add = 008FF70D.
cell_content_char = yowe, add = 008FF70D.
cell_content      = yyowe, add = 008FF70C.
ending test.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值