大家好,今天小編來為大家解答以下的問題,關于數組和指針的區別總結,數組就是指針嗎這個很多人還不知道,現在讓我們一起來看看吧!
數組指針與指針數組的區別
數組指針與指針數組在聲明方式、類型及特點上有著顯著區別。
數組指針是指一個指針,它指向一個數組,通過該指針可以方便地訪問數組中的元素,同時也可以通過該指針來修改數組元素的值。
指針數組是指一個數組,其中每個元素都是一個指針,指向不同的內存地址,因此可以通過這些指針來訪問和修改不同的數據或變量。
總的來說,指針數組更加靈活,可以指向不同類型的數據,而數組指針則更加簡潔,可以方便地進行數組操作。在實際應用中,需根據具體情況靈活選擇使用哪種形式。
指針參數與數組參數的關系
C++/C程序中,指針和數組在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。
數組要么在靜態存儲區被創建(如全局數組),要么在棧上被創建。數組名對應著(而不是指向)一塊內存,其地址與容量在生命期內保持不變,只有數組的內容可以改變。
指針可以隨時指向任意類型的內存塊,它的特征是“可變”,所以我們常用指針來操作動態內存。
當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指針。
所以:
chara[]="helloworld";
char*p=a;
cout<<sizeof(a)<<endl;//12字節
cout<<sizeof(p)<<endl;//4字節
voidFunc(chara[100])
{
cout<<sizeof(a)<<endl;//4字節而不是100字節
}
C語言學到指針了,我經常把數組指針和指針數組弄混,它倆究竟有何區別該如何理解
謝謝邀請。
很多C語言初學者在學到指針時,都會遇到“數組指針”和“指針數組”這兩個名詞,然后就一臉懵逼了,其實在考慮C語言中的數組指針和指針數組時,只需多加幾個字,一切就清晰許多了:
數組指針->數組類型的指針,所以數組指針是一個指針。
指針數組->指針類型的數組,所以指針數組其實是一個數組。
指向數組的指針在討論數組指針之前,先來看一段C語言代碼,如下:
C語言中的指針不僅有加法運算,還有減法運算,不過乘除運算就是非法的了。編譯并執行上述C語言代碼,可以得到如下輸出:
其實,訪問指針p指向的數值,除了“*”運算符外,也可以以數組的形式,本例中p[N]和*(p+N)是等價的:
相信有讀者已經注意到p[-1]了,這似乎與C語言數組下標不能為負的語法相悖,那為何這里能夠編譯通過,并正常運行呢?鑒于該問題與主題無關,這里不再贅述,感興趣的讀者可翻閱我之前的文章。數組指針如果題主覺得上面的C語言代碼示例沒有難度,其實你已經會用數組指針了。在上面的例子中,p就是一個數組指針。p是一個char*型的指針,它指向數組,所以叫“數組指針”。
數組指針就是指向數組的指針,就像int型指針就是執行int型變量的指針一樣。
數組指針就這么簡單。其實,記住數組指針就是指向數組的指針這句話后,再復雜點的情況也能輕松應對。請看下面的例子,我們先用C語言定義一個二維數組,用來存三個人名:
name[3][6]中的3表示name數組一共有3行,6表示每行最多有6個char型數據。現在,我想用數組指針指向這三個人名,可以如下定義:
()優先級高,說明p2首先是個指針,什么類型呢?括號里的內容看過了,現在忽略它,那顯然,p2是一個指向char[6](6元素數組類型)的指針,name就是一個char[6]型的數據,所以可以直接把name賦值給p2:
p2=name;如果題主看過我之前的文章,應該知道指針的加法運算結果受指針的類型影響,那如果p2指向的地址為0,p2[1](即p2+1)指向的地址為多少呢?
答案是6,因為p2是一個char[6]類型的指針。對于name而言,一行為6字節,因此p2[N]恰好指向的是name的每一行,因此數組指針又被稱作“行指針”。如果執行以下C
語言代碼:
實際上就是把name記錄的三個人名打印出來。以數組的形式訪問也是一樣的:
編譯并執行,得到如下輸出:
指針數組討論完了數組指針,再來看看指針數組。其實,指針數組就是一個數組,只不過這個數組里存放的都是指針而已。就跟我們說int數組是一個存放int的數組一樣。在C語言中指針數組的定義也很簡單:
char*p3[3];[]的優先級高于*,說明p3首先是個數組,什么類型的數組呢?char*型的,char*表示一個指針類型,所以p3就是一個指針數組。
如果使用指針數組指向name,就不能直接把name賦值給p3了,因為類型不同。但是,p3里存放的都是char*型的指針,即p3[0],p3[1],p3[2]是char*型的指針,而name[0],name[1],name[2]也是char*型的指針,所以可以把name[N]賦值給p3[N],請看如下C語言代碼:
編譯并執行,可以得到如下輸出:
與預期一致。這樣,我們就使用了C語言中的指針數組訪問了name數組。
小結到這里,C語言中的數組指針和指針數組兩者的區別就豁然開朗了,數組指針是一個指針變量,它占有內存中一個指針的存儲空間。指針數組是多個指針變量,也即數組,以數組形式存在內存當中,占有多個指針的存儲空間。
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。
數組指針和指針數組的區別
區別是數據類型不同。
數組指針:是指一個指向數組的指針,它其實還是一個指針,只不過是指向數組而已;
指針數組:是指一個數組里面裝著指針,也即指針數組是一個數組;
數組和指針之間有什么關系
1、指針:系統為某一個變量開辟單元格,指針便指向此單元格的變量值。
2、數組:系統為某一組數開辟一組單元格,數組首地址便是你定義的數組變量名。
數組和指針的唯一區別是,不能改變數組名稱指向的地址。
對于數組來說,數組的首地址,也可以用指針來表示操作,如:
inta[10];
int*p,n;
p=a;
對第一個元素取值,可以用幾種方法:
n=a[0];
n=*p;
n=p[0];
n=*(p+0);
但是以下語句則是非法的:
readings=totals;//非法!不能改變readingstotals=dptr;//非法!不能改變totals
數組名稱是指針常量。不能讓它們指向除了它們所代表的數組之外的任何東西。
擴展資料
下面的程序定義了一個double數組和一個double指針,該指針分配了數組的起始地址。隨后,不僅指針符號可以與數組名稱一起使用,而且下標符號也可以與指針一起使用。
intmain()
{
constintNUM_COINS=5;
doublecoins[NUM_COINS]={0.05,0.1,0.25,0.5,1.0};
double*doublePtr;//Pointertoadouble
//AssigntheaddressofthecoinsarraytodoublePtr
doublePtr=coins;
//Displaythecontentsofthecoinsarray
//Usesubscriptswiththepointer!
cout<<setprecision(2);
cout<<"Herearethevaluesinthecoinsarray:\n";
for(intcount=0;count<NUM_COINS;count++)
cout<<doublePtr[count]<<"";
//Displaythecontentsofthecoinsarrayagain,butthistimeusepointernotationwiththearrayname!
cout<<"\nAndheretheyareagain:\n";
for(intcount=0;count<NUM_COINS;count++)
cout<<*(coins+count)<<"";
cout<<endl;
return0;
}
程序輸出結果:
Herearethevaluesinthecoinsarray:0.050.10.250.51Andheretheyareagain:0.050.10.250.51
當一個數組的地址分配給一個指針時,就不需要地址運算符了。由于數組的名稱已經是一個地址,所以使用&運算符是不正確的。但是,可以使用地址運算符來獲取數組中單個元素的地址。
好了,本文到此結束,如果可以幫助到大家,還望關注本站哦!