char s1[10];
s1[0] ,s1[1]等都是char
變量名s1是char*,等同於&s1[0],是首個數組值的地址。
指針數組
char *s2[10];
s2[0] , s2[1]等都是char*;
*s2[0], *s2[1]等都是char,是s2[0] s2[1]指向的字符串的第一個字符;
s2是char**,等同於&s2[0];
char **s3[10];
s3[0] , s3[1]等都是char**;
*s3[0] , *s3[1]等都是char*,是s3[0],s3[1]這些char**指針指向的那個char*指針;
**s3[0], **s3[1]等都是char,是*s3[0] *s3[1]這些char*指針指向的字符串的第一個字符;
s3是char***,等同於&s3[0].
char s1[3];
char*s2[3];
char**s3[3];
s1[0]='1';
s1[1]='2';
s1[2]='3';
s2[0]=&s1[0];
s2[1]=s1;
s3[0]=&s2[0];
s3[1]=s2;
內存中的數據如下圖
明確這一點:指針的值就是它所指向的那個地址,對指針做*運算,就是把指針所指向的那個地址的值取出來
s1[0] ,s1[1], s1[2]存放的是字符。
s1這個char*指針的值是0x0012ff60,說明s1這個char*指針指向的地址是0x0012ff60, 這個地址處存放着s1[0]這個字符。
s2[0]是一個char*指針,指向字符串”1234”
*s2[0]是第一個字符 ‘1’
s2這個char**指針的值是0x0012ff4c,說明s2這個char**指針指向的地址是0x0012ff4c,這個地址處存放着一個char*指針,也就是s2[0]。
s2[0]這個char*指針的值是0x0012ff60,和s1這個char*指針的值相同,說明s2[0]這個char*指針指向的地址也是0x0012ff60,這個地址存放着s1[0]這個字符。
s2[0]=&s1[0];
s2[1]=s1;
因爲s1等同於&s1[0],所以s2[1]這個char*指針的值也是0x0012ff60。
s3這個char***指針的值是0x0012ff38,說明s3這個char***指針指向的地址是0x0012ff38,這個地址處存放着一個char**指針,也就是s3[0]。
s3[0]這個char**指針的值是0x0012ff4c,和s2這個char**指針的值相同,說明s3[0]這個char**指針指向的地址也是0x0012ff4c,這個地址存放着s2[0]這個char*指針
s3[0]=&s2[0];
s3[1]=s2;
因爲s2等同於&s2[0],所以s3[1]這個char**指針的值也是0x0012ff4c
下面是一張簡單的示意圖
char s1[4]="123";
//char* s2=&s1[0];
char* s2=s1;
char**s3=&s2;
cout<<s2<<endl;
cout<<s3<<endl;
cout<<*s3<<endl;
printf("%d\n",s3);
printf("%x\n",s3);
上面這段代碼的輸出如下圖
(1245012轉成16進制就是12ff54)
原文地址:http://blog.sina.com.cn/s/blog_65db99840100lwhs.html