今天給各位分享指針和數組名的區別的知識,其中也會對數組名和指針變量是相互等價的進行解釋,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧!
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等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。
數組指針與指針數組的區別
數組指針與指針數組在聲明方式、類型及特點上有著顯著區別。
數組指針是指一個指針,它指向一個數組,通過該指針可以方便地訪問數組中的元素,同時也可以通過該指針來修改數組元素的值。
指針數組是指一個數組,其中每個元素都是一個指針,指向不同的內存地址,因此可以通過這些指針來訪問和修改不同的數據或變量。
總的來說,指針數組更加靈活,可以指向不同類型的數據,而數組指針則更加簡潔,可以方便地進行數組操作。在實際應用中,需根據具體情況靈活選擇使用哪種形式。
數組名和指針的區別
數組和指針的區別:數組名確實表示指向數組首地址的指針,但這個指針很特別,它的值(指針的值指的是指針所指的地址)不能被改寫,能改寫的僅僅是其指向的內容,換句話說,數組名只能指向數組的首地址,如果有數組chara[];那么如果出現a=a+1;這是編譯都通不過的錯誤。而對于一個普通的指針是可以的,再比如有數組chara[];那么再定義一個char*p=a;然后再用p=p+1是合法的,這表示讓指針p指向&a[1]。它們的第二個區別是:每當用到數組名這個指針的時候,系統都會傳入數組的信息,而普通的指針只是一個4字節的整數,例如:
chara[5];char*p=a;//指針a和指針p都指向數組a的首地址cout<<sizeof(a)<<"##"<<sizeof(p)<<endl;
這時的運行結果是“5##4”
指針、數組名、函數名都是地址嗎
是的。c語言中,函數名也稱為函數的指針,所以c語言中函數名就是一個指針。“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。
如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后。可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數指針有兩個用途:調用函數和做函數的參數。
指針數組和數組指針有什么區別
指針數組和數組指針的區別如下:
1.定義方式不同:指針數組是一個元素為指針類型的數組,而數組指針是一個指向數組的指針。
2.數據類型不同:指針數組中每個元素都是一個指針,而數組指針本身是一個指向特定類型數據的數組。
3.訪問元素不同:在訪問指針數組時,需要首先訪問該元素所在的位置,然后使用間接引用操作符(*)來訪問該元素所指向的值;在訪問數組指針時,可以直接使用下標操作符[]訪問其所指向的數組中的元素。
4.內存布局不同:對于指針數組,每個元素都是一個獨立的內存位置,其值存儲了相應對象或變量地址;而對于數組指針,它本身也是一個變量,并且存儲了整個數組的地址。
END,本文到此結束,如果可以幫助到大家,還望關注本站哦!