共享内存中使用指针_详解c++中字符指针数组的使用
之前有寫過一篇叫c++中動態數組的使用,今來看看c++中的字符指針數組的使用。
濤哥:c++中的動態數組使用?zhuanlan.zhihu.com指針數組,就指向指針的指針,很早以前在說指針的時候說過,但后來發現很多人還是比較難以理解,這一次我們再次仔細說一說指向指針的指針。
先看下面的代碼,注意看代碼中的注解:
#include <iostream> #include <string> using namespace std; void print_char(char* array[],int len);//函數原形聲明 void main(void) { //-----------------------------段1----------------------------------------- char *a[]={"abc","cde","fgh"};//字符指針數組 char* *b=a;//定義一個指向指針的指針,并賦予指針數組首地址所指向的第一個字符串的地址也就是abc0字符串的首地址 cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl; //------------------------------------------------------------------------- //-----------------------------段2----------------------------------------- char* test[]={"abc","cde","fgh"};//注意這里是引號,表示是字符串,以后的地址每加1就是加4位(在32位系統上) int num=sizeof(test)/sizeof(char*);//計算字符串個數 print_char(test,num); cin.get(); //------------------------------------------------------------------------- } void print_char(char* array[],int len)//當調用的時候傳遞進來的不是數組,而是字符指針他每加1也就是加上sizeof(char*)的長度 { for(int i=0;i<len;i++) { cout<<*array++<<endl; } }下面我們來仔細說明一下字符指針數組和指向指針的指針,段1中的程序是下面的樣子:
char *a[]={"abc","cde","fgh"}; char* *b=a; cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;char *a[]定義了一個指針數組,注意不是char[], char[]是不能同時初始化為三個字符的,定義以后的a[]其實內部有三個內存位置,分別存儲了abc0,cde0,fgh0,三個字符串的起始地址,而這三個位置的內存地址卻不是這三個字符串的起始地址,在這個例子中a[]是存儲在棧空間內的,而三個字符串卻是存儲在靜態內存空間內的const區域中的,接下去我們看到了char* *b=a;這里是定義了一個指向指針的指針,如果你寫成char *b=a;那么是錯誤的,因為編譯器會返回一個無法將char* *[3]轉換給char *的錯誤,b=a的賦值,實際上是把a的首地址賦給了b,由于b是一個指向指針的指針,程序的輸出cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;
結果是:
abccde
fgh
可以看出每一次內存地址的+1操作事實上是一次加sizeof(char*)的操作,我們在32位的系統中sizeof(char*)的長度是4,所以每加1也就是+4,實際上是*a[]內部三個位置的+1,所以*(b+1)的結果自然就是cde了,我們這時候可能會問,為什么輸出是cde而不是c一個呢?答案是這樣的,在c++中,輸出字符指針就是輸出字符串,程序會自動在遇到0后停止.
我們最后分析一下段2中的代碼,段2中我們調用了print_array()這個函數,這個函數中形式參數是char *array[]和代碼中的char *test[]一樣,同為字符指針,當你把參數傳遞過來的時候,事實上不是把數組內容傳遞過來,test的首地址傳遞了進來,由于array是指針,所以在內存中它在棧區,具有變量一樣的性質,可以為左值,所以我們輸出寫成了,cout<<*array++<<endl;當然我們也可以改寫為cout<<array[i]<<endl,這里在循環中的每次加1操作和段1代碼總的道理是一樣的,注意看下面的圖!
下面是內存結構示意圖:
到這里這兩個非常重要的知識點我都說完了,說歸說,要想透徹理解希望讀者多動手,多觀察,熟能生巧。
備注:
于作者水平,難免有理解和描述上有疏漏或者錯誤的地方,歡迎共同交流;部分參考已經在正文和參考文獻中列表注明,但仍有可能有疏漏的地方,有任何侵權或者不明確的地方,歡迎指出,必定及時更正或者刪除;文章供于學習交流,轉載注明出處。
總結
以上是生活随笔為你收集整理的共享内存中使用指针_详解c++中字符指针数组的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子科技大学计算机读博好毕业,高产博士生
- 下一篇: 近世代数-群论基础二