精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【C語言進階】“數組指針”和“指針數組”都是啥跟啥?

嵌入式物聯網開發 ? 來源:嵌入式物聯網開發 ? 作者:嵌入式物聯網開發 ? 2022-08-31 13:21 ? 次閱讀

相信學習過C語言的童鞋,一定被這2個東西折騰過吧?究竟它們都是何方神圣呢?帶著這個問題,筆者想通過本文給你一個清晰的答案。通過閱讀本文,你將了解到以下內容:

  • 什么是數組指針?
  • 什么是指針數組?
  • 數組指針和指針數組有什么區別?
  • 使用指針數組的注意事項

什么是數組指針?


? 【數組指針】,從字面意思上理解,就是一個【指針】;“數組”只是起到了修飾“指針”的作用,所以連起來的意思就是【指向數組的指針】。這一點與上一篇文章介紹 【函數指針】有異曲同工的含義。

? 從C語言的語法上理解,數組指針的表示形式為:

//定義一個一維數組
int a[3];

//定義一個指針,指向一維數組的首地址
int *q = a;

//定義一個3行4列的二維數組
int b[3][4]; 

//定義一個數組指針,它指向二維數組的首地址
int (*p)[4] = b;

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eQIadh0d-1661923181862)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 從數組指針的形式上看,因為()運算符擁有最高優先級,所以整個語句優先被解釋成一個指針;接著,這個指針再指向另一個數組的首地址,[x]接上該數組的列數,即得到如上的數組指針的定義。

? 經過這個例子,我們可以看到,數組指針一般用于表達多維數組,對比起多維數組的表示,采用數組指針的形式可以在一定程度上理解難度減小了。比如,有了如上的數組指針定義后,這里b是個二維數組的數組名,相當于一個二級指針常量;p是一個指針變量,它指向包含5個int元素的一維數組,此時p的增量以它所指向的**一維數組長度為單位;*(**p+i)是一維數組b[i][0]的地址;(p+2)+3表示b[2][3]地址(第一行為0行,第一列為0列),(*(p+2)+3)表示b[2][3]的值。


什么是指針數組?


? 【指針數組】,從字面意思上理解,它就是一個數組,只不過“指針”是用于修飾“數組”的,所以合起來理解就是:【一個數組元素存放的是指針的數組】。

? 從C語言的語法上理解,【指針數組】的定義形式如下所示:

//定義一個char *的指針數組
char *p[5];

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Qud5CpbF-1661923181865)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 這里,它表示的含義是,一個由5個元素組成的一維數組,每個數組元素都是一個指針(地址)。訪問數組的元素,我們都是采用 數組名[數組下標] 的形式訪問的,那么【指針數組】也不例外,訪問第一個元素,則是p[0];同理,p[2]表示的是第3個指針。


數組指針和指針數組有什么區別?


? 從字面上看,確實很容易混淆兩者的概念;我們理解的時候,需要注意名詞誰先誰后。一般來說,在前面的名詞是用于修飾后面的名詞,而后面的名詞決定了整個詞組的性質。

? 【數組指針】:數組修飾指針,它的本質是一個指針;一般這個指針指向一個二維數組,形式為: int (*p)[M]。

? 【指針數組】:指針修飾數組,它的本質是一個數組;這個數組里面的元素,存放的都是指針,形式為: int *p[M]。

? 如上定義中,第一個M表示二維數組的列數,第二個M表示的指針數組(一維數組)的元素個數。

? 數據訪問方面:

  • (*p)[0] 表示的是二維數組中的第一行的首地址;
  • p[0] 表示的指針數組的第一個元素,即第一個指針地址。

使用指針數組的注意事項


? 這兩個概念不但容易混淆,而且在使用過程中也是十分容易出錯,曾經筆者在【指針數組】上摘過跟頭?,F將出錯的教訓分享給大家:

  • 求一個指針數組的中元素的個數,不是簡單地使用sizeof

? 比如有一個指針數組的定義:

char *p[5];

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CRsvrkY7-1661923181868)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 假設在編程平臺上,一個指針所占用的地址空間是4個字節,即sizeof(char ) = 4;那么如果使用sizeof§去求這個指針數組所占用的地址空間時,求得的大小是45=20;而每個元素都是char *類型,所以求得指針元素的個數為: 20 / 4 = 5。

? 于是,我們得出一個公式,求指針數組的元素個數:

//直接求得指針數組p的元素個數
cnt = sizeof(p) / sizeof(p[0]);

//很多時候,我們會定義一個宏來表示,形式如下:

#ifndef ARRAY_SIZE
#define ARRAY_SIZE(a)  (sizeof(a) / sizeof(a[0]))
#endif

//使用ARRAY_SIZE宏求指針數組p的元素個數
cnt = ARRAY_SIZE(p);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qwfXvoOo-1661923181869)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

  • 定義字符串類型的指針數組時,每個元素(字符串)注意用分號隔開,否則可能出現意想不到的事情

? 假設有以下2個指針數組的定義:

const char *p1[] = 
{
    "12345",
    "23456",
    "34567",
    "45678",
    "56789",
};

const char *p2[] = 
{
    "12345",
    "23456"
    "34567",
    "45678"
    "56789",
};

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Wt3RK9bs-1661923181874)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 如果你不仔細看,你可能覺得p1和p2的定義是一致;仔細一看,原來p2中少了2個分號;而這2個分號一少,直接就導致p2的最終被編譯器識別成的定義為:

//最終被識別的定義
const char *p2[] = 
{
    "12345",
    "2345634567",
    "4567856789",
};

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aNeQ6PqX-1661923181875)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 看到區別了嗎?由于分號的缺失導致前后相鄰的字符串被結合在一塊,被連接成一個更長的字符串,而這種【拼接】是編譯器自動識別完成的,它不會提示任何錯誤,因為在它看來根本就不是錯誤。對使用者而言,這樣定義一改變,原本本應該為5個元素的字符串數組,就變成了3個字符串的數組,這簡直就是災難?。。?!


? 以上就是筆者對【數組指針】和【指針數組】的實踐,得出的切實理解,希望能夠幫助大家更近一步地理解它們。以上提及觀點,均為筆者本人的觀點,如有紕漏之處,還望指正。感激不盡。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7576

    瀏覽量

    133998
  • 數組指針
    +關注

    關注

    0

    文章

    5

    瀏覽量

    5217
  • 函數指針
    +關注

    關注

    2

    文章

    55

    瀏覽量

    3760
收藏 人收藏

    評論

    相關推薦

    C語言數組名和指針

    指針C/C++語言的特色,而數組名與指針有太多的相似,甚至很多時候,
    發表于 08-27 17:48 ?675次閱讀

    C語言數組指針的區別

    大家好,我是嵌入式老林,從事嵌入式軟件開發多年,今天分享的內容是C語言數組指針的區別,希望能對你有所幫助。
    發表于 07-11 12:40 ?333次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>數組</b>和<b class='flag-5'>指針</b>的區別

    C語言中指針數組數組指針的區別

    指針數組之間存在著緊密的關系。在本文中,我們將探討指針數組的關系、指針算術和數組遍歷、多維
    發表于 08-17 15:29 ?363次閱讀

    轉: 吊絲整理C語言 數組指針 指針數組

    主要針對指針數組數組指針。大家看看對不對。沒有好辦法把文檔內容貼出來。先貼幾個圖片吧。里面有幾個錯誤,等你自己發掘吧,這樣你就可以笑笑說
    發表于 08-08 10:03

    C語言入門教程-用指針操作數組

    C語言入門教程 在C語言中,數組指針的關系十分密切。要想有效地使用
    發表于 07-29 12:18 ?1461次閱讀

    指針數組都是C語言的精髓所在 兩者有何聯系區別

    指針數組都是C語言的精髓所在,對于很多C程序員來說,如果你問這樣一個問題:
    的頭像 發表于 05-27 14:51 ?3846次閱讀
    <b class='flag-5'>指針</b>和<b class='flag-5'>數組</b><b class='flag-5'>都是</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>的精髓所在 兩者有何聯系區別

    指針數組數組指針的區別

    這里我們區分兩個重要的概念:指針數組、數組指針
    的頭像 發表于 06-29 15:30 ?1.9w次閱讀
    <b class='flag-5'>指針</b><b class='flag-5'>數組</b>和<b class='flag-5'>數組</b><b class='flag-5'>指針</b>的區別

    理解函數指針、函數指針數組、函數指針數組指針

    理解函數指針、函數指針數組、函數指針數組指針
    的頭像 發表于 06-29 15:38 ?1.5w次閱讀
    理解函數<b class='flag-5'>指針</b>、函數<b class='flag-5'>指針</b><b class='flag-5'>數組</b>、函數<b class='flag-5'>指針</b><b class='flag-5'>數組</b>的<b class='flag-5'>指針</b>

    C語言中指針數組

    #define SIZE 10int arry[SIZE]={0,1,2,3,4,5,6,7,8,9}; //數組名arry表示數組首元素的地址*int p,temp;//可直接初始化定義指針
    發表于 01-13 13:11 ?3次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言中指針</b>與<b class='flag-5'>數組</b>

    C語言指針數組的區別

    C語言教程中我們使用通過數組名通過偏移和指針偏移都可以遍歷數組,那么指針
    的頭像 發表于 07-18 16:29 ?1784次閱讀

    二維數組數組指針以及指針數組

    二維數組數組指針以及指針數組
    的頭像 發表于 08-16 09:02 ?2494次閱讀

    C語言數組元素的指針

    C語言調用函數時虛實結合的方法都是采用“值傳遞”方式,當用變量名作為函數參數時傳遞的是變量的值,當用數組名作為函數參數時。 由于數組
    的頭像 發表于 03-10 14:45 ?750次閱讀

    C語言中什么是指針數組

    C語言中一個數組,若其元素均為指針類型數據,稱為指針數組,也就是說,
    的頭像 發表于 03-10 15:26 ?1561次閱讀

    數組指針不能混用的情況

    數組指針不能混用的情況? 數組指針C/C++ 中非常常見的特性和概念。然而,在某些情況下
    的頭像 發表于 12-07 13:46 ?488次閱讀

    數組指針不相同嗎?數組指針有哪些區別

    數組就是指針指針就是數組,這樣的言論在評論區看到不下于10次。
    的頭像 發表于 12-13 16:34 ?908次閱讀
    <b class='flag-5'>數組</b>和<b class='flag-5'>指針</b>不相同嗎?<b class='flag-5'>數組</b>和<b class='flag-5'>指針</b>有哪些區別