本文转载自:http://www.felix021.com/blog/read.php?1690
此文主要分析几种相似的二级字符指针定义方法的含义:
1 2 3 4 5 | char ** a; const char ** b; char * const * c; const char * const * d; const char * const * const e; |
看示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include <iostream> #include <string> using namespace std; void test1(){ char **s; //s是数组的指针; s = NULL; s = new char*[4]; for (int i = 0; i < 4; ++i){ s[i] = new char[10]; strcpy(s[i], "test"); } for (int i = 0; i < 4; ++i){ printf("%s\n", s[i]); } for (int i = 0; i < 4; ++i){ delete[] s[i]; } delete[] s; } void test2(){ const char **s; //s是指向字符串常量的指针 s = NULL; char b[4][10] = {"a","b","c","d"}; s = new const char*[4]; for (int i = 0; i < 4; ++i){ s[i] = b[i]; // OK //s[i][0] = 'd'; //这句要报错,因为s[i]指向的是字符串常量 //即使b[i]字符串本不是常量(编译期间添加的属性) } for (int i = 0; i < 4; ++i){ printf("%s\n", s[i]); } delete[] s; } void test3(){ char * const * s; //s指向常量数组,数组的每一个元素是字符指针常量。 //数组的元素不可改,但数组元素指向的字符串可修改 s = NULL;// s不是常量 char a[4][10] = {"aa", "bb", "cc", "dd"}; char * const(b[4]) = {a[0], a[1], a[2], a[3]}; s = b; for (int i = 0; i < 4; ++i){ s[i][1] = 'd'; //OK //s[i] = NULL; //报错,因为s[i]是常量 printf("%s\n", s[i]); } } void test4(){ const char * const * s; //s指向一个常量指针数组 //数组的每一个元素是字符指针常量,指向字符串常量(绕口令阿这是。。。) s = NULL;// s不是常量 char a[4][10] = {"aa", "bb", "cc", "dd"}; char * const(b[4]) = {a[0], a[1], a[2], a[3]}; s = b; for (int i = 0; i < 4; ++i){ //s[i][1] = 'd'; //报错,因为s[i][j]是常量 //s[i] = NULL; //报错,因为s[i]是常量 printf("%s\n", s[i]); } } void test5(){ char a[4][10] = {"aa", "bb", "cc", "dd"}; const char * const(b[4]) = {a[0], a[1], a[2], a[3]}; const char * const * const s = b; //s是一个常量指针,指向一个常量指针数组 //数组的每一个元素是字符指针常量,指向字符串常量(这才是绕口令!) //s = NULL; //Error, s是常量 for (int i = 0; i < 4; ++i){ //s[i][1] = 'd'; //报错,因为s[i][j]是常量 //s[i] = NULL; //报错,因为s[i]是常量 printf("%s\n", s[i]); } } int main(){ test1(); test2(); test3(); test4(); test5(); return 0; } |
总结:
char ** s; s是一个指针1,指向一个指针2, 指针2指向char const char ** s; s是一个指针1,指向一个指针2,指针2指向char,char是常数 char * const * s; s是一个指针1,指向一个常量1,常量1是个指针2,指针2指向char const char * const * s; s是一个指针1,指向一个常量1,常量1是个指针2,指针2指向char,char是常数 const char * const * const s; s是一个常量1,常量1是一个指针1,指针1指向一个常量2,常量2是个指针2,指针2指向char,char是常数
最后,感谢Felix的精彩解析!
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
呵呵,主要是有个网友问了这个问题,我发现我也不会,于是好好研究了一下,很有收获
阿,你就是Ivan阿,囧。我还以为dutor和ivan是两个人。。。
用哪个名字真是随机的,O(∩_∩)O哈哈~