日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

共享内存中使用指针_详解c++中字符指针数组的使用

發(fā)布時(shí)間:2023/12/10 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 共享内存中使用指针_详解c++中字符指针数组的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前有寫過一篇叫c++中動態(tài)數(shù)組的使用,今來看看c++中的字符指針數(shù)組的使用。

濤哥:c++中的動態(tài)數(shù)組使用?zhuanlan.zhihu.com

指針數(shù)組,就指向指針的指針,很早以前在說指針的時(shí)候說過,但后來發(fā)現(xiàn)很多人還是比較難以理解,這一次我們再次仔細(xì)說一說指向指針的指針。

先看下面的代碼,注意看代碼中的注解:

#include <iostream> #include <string> using namespace std; void print_char(char* array[],int len);//函數(shù)原形聲明 void main(void) { //-----------------------------段1----------------------------------------- char *a[]={"abc","cde","fgh"};//字符指針數(shù)組 char* *b=a;//定義一個(gè)指向指針的指針,并賦予指針數(shù)組首地址所指向的第一個(gè)字符串的地址也就是abc0字符串的首地址 cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl; //------------------------------------------------------------------------- //-----------------------------段2----------------------------------------- char* test[]={"abc","cde","fgh"};//注意這里是引號,表示是字符串,以后的地址每加1就是加4位(在32位系統(tǒng)上) int num=sizeof(test)/sizeof(char*);//計(jì)算字符串個(gè)數(shù) print_char(test,num); cin.get(); //------------------------------------------------------------------------- } void print_char(char* array[],int len)//當(dāng)調(diào)用的時(shí)候傳遞進(jìn)來的不是數(shù)組,而是字符指針?biāo)考?也就是加上sizeof(char*)的長度 { for(int i=0;i<len;i++) { cout<<*array++<<endl; } }

下面我們來仔細(xì)說明一下字符指針數(shù)組和指向指針的指針,段1中的程序是下面的樣子:

char *a[]={"abc","cde","fgh"}; char* *b=a; cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;

  char *a[]定義了一個(gè)指針數(shù)組,注意不是char[], char[]是不能同時(shí)初始化為三個(gè)字符的,定義以后的a[]其實(shí)內(nèi)部有三個(gè)內(nèi)存位置,分別存儲了abc0,cde0,fgh0,三個(gè)字符串的起始地址,而這三個(gè)位置的內(nèi)存地址卻不是這三個(gè)字符串的起始地址,在這個(gè)例子中a[]是存儲在??臻g內(nèi)的,而三個(gè)字符串卻是存儲在靜態(tài)內(nèi)存空間內(nèi)的const區(qū)域中的,接下去我們看到了char* *b=a;這里是定義了一個(gè)指向指針的指針,如果你寫成char *b=a;那么是錯(cuò)誤的,因?yàn)榫幾g器會返回一個(gè)無法將char* *[3]轉(zhuǎn)換給char *的錯(cuò)誤,b=a的賦值,實(shí)際上是把a(bǔ)的首地址賦給了b,由于b是一個(gè)指向指針的指針,程序的輸出cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;

結(jié)果是:

abc
cde
fgh

  可以看出每一次內(nèi)存地址的+1操作事實(shí)上是一次加sizeof(char*)的操作,我們在32位的系統(tǒng)中sizeof(char*)的長度是4,所以每加1也就是+4,實(shí)際上是*a[]內(nèi)部三個(gè)位置的+1,所以*(b+1)的結(jié)果自然就是cde了,我們這時(shí)候可能會問,為什么輸出是cde而不是c一個(gè)呢?答案是這樣的,在c++中,輸出字符指針就是輸出字符串,程序會自動在遇到0后停止.

  我們最后分析一下段2中的代碼,段2中我們調(diào)用了print_array()這個(gè)函數(shù),這個(gè)函數(shù)中形式參數(shù)是char *array[]和代碼中的char *test[]一樣,同為字符指針,當(dāng)你把參數(shù)傳遞過來的時(shí)候,事實(shí)上不是把數(shù)組內(nèi)容傳遞過來,test的首地址傳遞了進(jìn)來,由于array是指針,所以在內(nèi)存中它在棧區(qū),具有變量一樣的性質(zhì),可以為左值,所以我們輸出寫成了,cout<<*array++<<endl;當(dāng)然我們也可以改寫為cout<<array[i]<<endl,這里在循環(huán)中的每次加1操作和段1代碼總的道理是一樣的,注意看下面的圖!

 下面是內(nèi)存結(jié)構(gòu)示意圖:

到這里這兩個(gè)非常重要的知識點(diǎn)我都說完了,說歸說,要想透徹理解希望讀者多動手,多觀察,熟能生巧。

備注:

于作者水平,難免有理解和描述上有疏漏或者錯(cuò)誤的地方,歡迎共同交流;部分參考已經(jīng)在正文和參考文獻(xiàn)中列表注明,但仍有可能有疏漏的地方,有任何侵權(quán)或者不明確的地方,歡迎指出,必定及時(shí)更正或者刪除;文章供于學(xué)習(xí)交流,轉(zhuǎn)載注明出處。

總結(jié)

以上是生活随笔為你收集整理的共享内存中使用指针_详解c++中字符指针数组的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。