C/C++中字符指針數組及指向指針的指針的含義

就指向指針的指針,很早以前在說指針的時候說過,但後來發現很多人還是比較難以理解,這一次我們再次仔細說一說指向指針的指針。

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

#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;//定義一個指向指針的指針,並賦予指針數組首地址所指向的第一個字符串的地址也就是abc\0字符串的首地址

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[]其實內部有三個內存位置,分別存儲了abc\0,cde\0,fgh\0,三個字符串的起始地址,而這三個位置的內存地址卻不是這三個字符串的起始地址,在這個例子中a[]是存儲在棧空間內的,而三個字符串卻是存儲在靜態內存空間內的const區域中的,接下去我們看到了char* *b=a;這裏是定義了一個指向指針的指針,假如你寫成char *b=a;那麽是錯誤的,因爲編譯器會返回一個無法將char* *[3]轉換給char *的錯誤,b=a的賦值,實際上是把a的首地址賦給了b,由于b是一個指向指針的指針,程序的輸出cout<<*b<<""<<*(b+1)<<""<<*(b+2)<<endl; 結果是abc

cde

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/C++中字符指針數組及指向指針的指針的含義
C/C++中字符指針數組及指向指針的指針的含義
更多內容請看C/C++技術專題專題,或

c/c++中的字符指針數組,指向指針的指針的含義
c/c++中的字符指針數組,指向指針的指針的含義
  就指向指針的指針,很早以前在說指針的時候說過,但後來發現很多人還是比較難以理解,這一次我們再次仔細說一說指向指針的指針! 先看下面的代碼,注重看代碼中的注解! //程序作者:管甯 //站點:www.cndev-lab.com //所...查看完整版>>c/c++中的字符指針數組,指向指針的指針的含義
 
C/C++中字符指針數組及指向指針的指針的含義
C/C++中字符指針數組及指向指針的指針的含義
  就指向指針的指針,很早以前在說指針的時候說過,但後來發現很多人還是比較難以理解,這一次我們再次仔細說一說指向指針的指針。  先看下面的代碼,注重看代碼中的注解: ...查看完整版>>C/C++中字符指針數組及指向指針的指針的含義
 
第五章 指向數組的指針
講到第五章了,數組兩個字還離不開我們的左右,數組的內容也真多,另一方面也因爲數組與指針的關系的確非常密切。 通常,對于int a這個二維數組,我們可以這樣定義一個指向它的指針:int (*p);這個聲明的形式...查看完整版>>第五章 指向數組的指針
 
C/C++語言中指向函數的指針
  “在C語言中,函數本身不是變量,但可以定義指向函數的指針,這種指針可以被賦值、存放于數組之中,傳遞給函數及作爲函數的返回值等” --《The C Programming Language Second Edition》 下面給出幾個簡單的例...查看完整版>>C/C++語言中指向函數的指針
 
指針、引用、數組和字符串,你真的全弄清楚了嗎?
注:1.未特別指明時,本文所述內容均爲C/C++(引用則爲C++)的;2.未特別指明時,本文的描述、測試和實現,一般基于80x86構架和Win32平台下的VC++6.0的debug模式,但我也會在某些地方強調指出;3.未特別指明時,我用...查看完整版>>指針、引用、數組和字符串,你真的全弄清楚了嗎?
 
C/C++語言中指向函數的指針
“在C語言中,函數本身不是變量,但可以定義指向函數的指針,這種指針可以被賦值、存放于數組之中,傳遞給函數及作爲函數的返回值等” --《The C Programming Language Second Edition》 下面給出幾個簡...查看完整版>>C/C++語言中指向函數的指針
 
C++中函數指針數組的使用
筆者在開發某軟件過程中碰到這樣一個問題,前級模塊傳給我二進制數據,輸入參數爲 char* buffer和 int length,buffer是數據的首地址,length表示這批數據的長度。數據的特點是:長度不定,類型不定,由第一個字節(...查看完整版>>C++中函數指針數組的使用
 
C++中函數指針數組的妙用
  筆者在開發某軟件過程中碰到這樣一個問題,前級模塊傳給我二進制數據,輸入參數爲 char* buffer和 int length,buffer是數據的首地址,length表示這批數據的長度。數據的特點是:長度不定,類型不定,由第一個字...查看完整版>>C++中函數指針數組的妙用
 
C++中數組和指針類型的關系
  一個整數類型數組如下進行定義: C++ 代碼 int a[]={1,2,3,4}; 假如簡單寫成: C++ 代碼 a;//數組的標識符名稱 這將代表的是數組第一個元素的內存地址,a;就相當于&a,它的類型是數組元素類型的指針,...查看完整版>>C++中數組和指針類型的關系
 
 
回到王朝網路移動版首頁