函参中的双重指针
在学习swap函数时,若想改变实参,可以将函参设置为指针类型。
那么函参中的双重指针,也是这种含义。想改变实参(指针类型)的指向或值时,可以用双重指针。
void change(char* p) { p = "bbb"; } int main() { char *v = "aaa"; change(v); printf("%s",v); return 0; }
输出的结果仍然是aaa。函数在传值时会先拷贝一份再传过去,想一想swap函数就理解了。即p和v是两个单独的指针,p指向别的内存,和v无关,v依然指向aaa。
void change(char** p) { *p = "bbb"; } int main() { char *v = "aaa"; change(&v); printf("%s",v); return 0; }
双重指针,既可以改变指向、也可以改变值。即p就是v。上述代码本质是改变了v的指向,由常量区的aaa,指向了常量区的bbb
关于常量区
int main() { char *v = "aaa"; //指向常量区(该区只读不可写) v[0] = 'b'; //报写入权限冲突 char w[] = "aaa"; //w是已经开辟的局部变量内存,栈内存 w[0] = 'b'; //正确 return 0; }
参考
【编译汇编链接】全局变量 char* g_str 和 char g_str[]_char * 全局变量-CSDN博客