咨询char*与char[]的二级指针使用及内容修改方法
二级指针与char*/char[]的配合逻辑解析
先搞懂char*和char[]的核心区别
char *message2 = "bye world";:message2是指针变量,存的是字符串常量"bye world"的首地址。它本身是个变量,能被取地址,也能通过二级指针修改它的指向。char message[] = "hello world";:message是数组名,本质是指向数组首元素的常量指针——它的指向不能改,数组本身是栈上分配的连续内存,存着字符串的每个字符。
你的代码里的两个致命问题
- 类型完全不匹配的强制转换
char ** ptr_message = (char*)&message;这里,&message的类型是char (*)[12](指向长度为12的char数组的指针),你硬转成char*再赋值给char**,类型乱套了,后续操作必然触发未定义行为。 - 试图修改数组名的指向
*ptr_message = "Hello";这行代码本质是想给数组名赋值,但数组名是常量指针,根本不能改指向。而且你把字符串常量"Hello"的地址往数组首地址的位置塞,会直接破坏栈结构,程序大概率崩溃。
正确的操作方式
1. 用二级指针修改char*的指向(你这部分是对的)
#include <stdio.h> int main() { char *message2 = "bye world"; char **ptr_message2 = &message2; *ptr_message2 = "Bye"; // 直接修改message2的指向,让它指向新的字符串常量 printf("%s\n", message2); // 输出Bye,没问题 return 0; }
2. 修改char[]的内容(不是改指向,是改数组里的字符)
如果要改char[]的内容,根本不需要二级指针,直接用一级指针或者数组下标就行;要是非要用二级指针(比如在函数里操作),得保证类型匹配:
#include <stdio.h> #include <string.h> // 用二级指针间接修改数组内容的函数 void change_array(char **arr_ptr) { // 解引用拿到数组的首地址,用strcpy修改内容 strcpy(*arr_ptr, "Hello"); } int main() { char message[] = "hello world"; // 先定义一个指向数组首元素的指针变量 char *msg_ptr = message; // 再取这个指针的地址给二级指针 char **ptr_message = &msg_ptr; change_array(ptr_message); printf("%s\n", message); // 输出Hello,正确 // 其实更简单的方式:不用二级指针,直接传数组名(会退化成一级指针) // strcpy(message, "Hello"); // printf("%s\n", message); return 0; }
关键要点总结
- char*是可变指针:能通过二级指针改它的指向,让它指向新的字符串或内存块。
- char[]是数组:数组名是常量指针,指向不能改;只能修改数组内存里的具体字符,用一级指针就够,二级指针在这里只是多一层间接性,没必要的话完全可以不用。
- 别乱强制类型转换:类型不匹配会导致各种莫名其妙的bug,严格遵循C的类型规则。
内容的提问来源于stack exchange,提问作者Lucky Im
相关产品推荐
相关产品推荐

