在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.