char、char*、char**數組

平時都用的是char數組,基本忘記了char*數組和char**數組該怎麼用了

char s1[10];

s1[0] s1[1]等都是char

s1char*,等同於&s1[0]

 

char*s2[10];

s2[0] s2[1]等都是char*

*s2[0] *s2[1]等都是char,是s2[0] s2[1]指向的字符串的第一個字符

s2char**,等同於&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*指針指向的字符串的第一個字符

s3char***,等同於&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;

內存中的數據如下圖

char、char*、char**數組

 

 

明確這一點:指針的值就是它所指向的那個地址,對指針做*運算,就是把指針所指向的那個地址的值取出來

 

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、char*、char**數組

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);

上面這段代碼的輸出如下圖

char、char*、char**數組

1245012轉成16進制就是12ff54

可以看到,cout<<s2輸出的是s2這個char*指針指向的地址處存放的數據,是一個字符串。

cout<<s3  輸出的是s3這個char**指針指向的地址處存放的數據,是一個char*指針(指針就是一個地址),其值是0012ff54,也就是說這個char*指針指向的地址是0012ff54

cout<<*s3 輸出的是s3這個char**指針指向的那個char*指針所指向的地址處存放的數據,是一個字符串。

可以總結,打印輸出一個指針,輸出的是指針所指向的地址處所存儲的數據

 

變量其實就是一個地址。普通變量比如int i,i這個變量名就等同於內存中爲這個變量分配的地址中存放的數據,這裏是一個4字節的整數。和彙編中的直接尋址是不是很像?

指針變量比如char*s,s這個變量名還是等同於內存中爲這個變量分配的地址中存放的數據,不過這裏的數據不是普通的整數或浮點數數據,而是一個4字節的地址。*s就是這個4字節的地址處存放的數據。是不是和彙編中的間接尋址很像?&s就是內存中爲這個變量分配的地址。考慮到我們輸出s的時候,輸出的都是s這個地址處存放的數據,如果想知道s這個4字節地址本身的值,可以int i=(int)s。

char、char*、char**數組

發佈了34 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章