吴忠躺衫网络科技有限公司

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

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

3天內不再提示

數組指針的基本概念與使用

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:C語言編程學習基地 ? 2022-08-14 15:39 ? 次閱讀

數組指針

整型指針:指向整型的指針

字符指針:指向字符的指針

數組指針:指向數組的指針

8b79f596-1add-11ed-ba43-dac502259ad0.png

基本概念

下面哪個是數組指針呢?

指針數組和數組指針的概念很容易混淆,一定要分清楚哦!

int *p1[10];int (*p2)[10];

p1是指針數組,每個元素的類型是int*

p2是數組指針,每個元素的類型是int(*)[10]

int (*p2)[10];//p2先和*結合,表示p2是一個指針變量//指向一個大小為10個整型的數組//所以p2是數組指針注:[ ]的優先級高于*,所以必須加上()來保證p2先和*結合

1.1、代碼示例

int* parr[6];int* (*pp)[6] = &parr;

pp是一個數組指針,類型是int*(*)[6],存放的是int*類型的數組,該數組有6個元素

8ba8cdee-1add-11ed-ba43-dac502259ad0.png

一般情況下,去掉變量名,剩下的即為變量類型

如:int* (*pp)[6]去掉變量名pp,變量類型為int*(*)[6]

char arr[5];char (*pa)[5] = &arr;

pa也是一個數組指針,變量類型為char(*)[5],指向char類型的數組,該數組元素個數為5

1.2、錯誤示范

你肯定會有一個疑問,變量類型為int(*)[5]的數組指針,能否指向數組元素為3或者6的數組呢?

8bc6db22-1add-11ed-ba43-dac502259ad0.png

程序能夠正常編譯,但是會報出如下警告

warning C4048: “int (*)[5]”和“int (*)[3]”數組的下標不同

在正常編寫代碼的時候,我們還是得保證數組指針和原數組的元素個數一致!

arr和&arr的區別

在進一步了解數組指針之前,我們需要了解arr和&arr的區別

當我們用%p打印arr和&arr時,會發現它們的結果是相同的

8bd80b5e-1add-11ed-ba43-dac502259ad0.png

但這能說明arr和&arr等價了嗎?

并不能!

再來看看下面這串代碼

8be82f84-1add-11ed-ba43-dac502259ad0.png

arr+1跳過4個字節,一個元素int的大小

&arr+1跳過40個字節,整個數組的大小

其實&arr和arr雖然指向的地址值相同,但是意義不同!

&arr表示的是數組的地址,是int(*)[10]類型

arr表示數組首元素的地址,是int*類型

數組的地址+1,跳過整個數組的大小

所以&arr+1和&arr的差值為40

對應的int(*p)[5]和int* p1也有不同

p接收的是&arr,整個數組的地址

p1接收arr,數組首元素的地址

數組指針的使用

3.1打印一維數組

下面這串代碼是用整型指針打印數組元素的情況

8c188260-1add-11ed-ba43-dac502259ad0.png

除了整型指針外,我們可以利用數組指針打印元素

int main(){  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };  int (*p)[10] = &arr;  int i = 0;  for (i = 0; i < 10; i++)  {    printf("%d ", *((*p) + i));        //*p-->arr  }  printf("
");  return 0;}

*p等價于arr,arr+i等價于&arr[i],對arr+i解引用就是arr[i]

8c2c2ae0-1add-11ed-ba43-dac502259ad0.png

但是這種方式實際上是把簡單問題復雜化了:我們本來就可以用int*指針來打印數組元素,為何要利用數組指針來多此一舉呢?

所以在一維數組里面,我們一般不會這么寫

3.2、打印二維數組

假設我現在需要一個print函數來打印二維數組

在之前,我們一般會想到用這張方式傳入二維數組

void print(int a[3][5], int r, int c);

當我們想用數組指針的時候,情況就有些變化了

數組名是數組首元素的地址

二維數組的首元素是第一行

二維數組的數組名表示第一行的地址

//main函數中print(arr,3,5);

這里prinf里面的arr就需要用數組指針來接收

該二維數組是3行5列,每一行都有5個元素,是一個int[5]的數組

對應的數組指針為int(*)[5]類型

void print(int(*p)[5], int r, int c)

這里的p指針指向的是二維數組第一行的地址

*p:對p直接解引用

相當于拿道了第一行元素的地址(把第一行看作數組,也就是數組的地址)

相當于是二維數組第一行首元素的地址

8c3c82d2-1add-11ed-ba43-dac502259ad0.png

對(p+i)解引用,就能拿到第i行第一個元素的地址

*(p+i)+j第i行第j個元素的地址

*(*(p+i)+j)第i行第j個元素

這一部分和上篇博客指針數組的內容相似

最終的函數實現如下

void print(int(*p)[5], int r, int c){  int i = 0;  for (i = 0; i < r; i++)  {    int j = 0;    for (j = 0; j < c; j++)    {      printf("%d ", *(*(p + i) + j));     }    printf("
");  }}int main(){  int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };  print(arr,3,5);  return 0;}

8c4928d4-1add-11ed-ba43-dac502259ad0.png

4練習:判斷

這一站最重要的就是區別指針數組和數組指針

4.1 int arr[5]

int arr[5];

arr是一個整型數組,有5個元素,每個元素是int類型的

4.2 int*parr[10]

int*parr1[10];

parr1是一個數組,數組有10個int*類型的元素

所以parr1是指針數組

4.3 int (*parr2)[10]

int(*parr2)[10];

parr2和*結合,表示parr2是一個指針

去掉parr2即為它的變量類型int(*)[10]

所以parr2是一個數組指針

4.4 int(*parr3[10])[5]

int(*parr3[10])[5];

[]的優先級高于*

parr3先和[]結合,說明parr3是一個數組

該數組有10個元素,每一個元素都是一個數組指針,類型是int(*)[5]

該數組指針指向的數組有5個int類型的元素

8c5be186-1add-11ed-ba43-dac502259ad0.png

結語

第三站數組指針到這里就結束啦!

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

    關注

    30

    文章

    4828

    瀏覽量

    69063
  • 數組指針
    +關注

    關注

    0

    文章

    5

    瀏覽量

    5250

原文標題:【C語言】指針進階第三站,數組指針!

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

    指針基本概念和運算

    指針基本概念和運算8.1 指針基本概念和運算 8.2 指針與一維數組  
    發表于 03-10 15:40

    數組基本概念

    數組是由若干同類元素組成的數據表。數組能表示非常廣泛的數據集合,一組相關的同類數據集合能用數組簡潔表示。例如,一個班級學生的某門課程的成績,一行字符,一個整數向量,由向量組成的矩陣等。
    發表于 11-19 16:41 ?0次下載

    數組指針的詳細講解

    數組指針的詳細講解
    發表于 10-16 08:44 ?0次下載

    指針數組的詳細資料和實例程序免費下載

    指針變量來訪問數組中任一元素,通常將數組的首地址稱為數組指針,而將指向數組元素的
    發表于 11-05 17:07 ?4次下載
    <b class='flag-5'>指針</b>與<b class='flag-5'>數組</b>的詳細資料和實例程序免費下載

    詳談數組指針的區別與聯系

    詳談數組指針的區別與聯系
    的頭像 發表于 06-29 15:18 ?2.3w次閱讀
    詳談<b class='flag-5'>數組</b>和<b class='flag-5'>指針</b>的區別與聯系

    指針數組數組指針的區別

    這里我們區分兩個重要的概念指針數組數組指針
    的頭像 發表于 06-29 15:30 ?2w次閱讀
    <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語言指針數組的區別

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

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

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

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

    【C語言進階】“數組指針”和“指針數組”都是啥跟啥?
    的頭像 發表于 08-31 13:21 ?1955次閱讀

    C語言中什么是指針數組

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

    數組指針不能混用的情況

    指針基本概念數組是一組相同類型的元素的集合,而指針是一個變量,它存儲了一個地址,該地址指向內存中的某個位置。在 C/C++ 中,數組
    的頭像 發表于 12-07 13:46 ?654次閱讀

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

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

    面試常考+1:函數指針指針函數、數組指針指針數組

    在嵌入式開發領域,函數指針指針函數、數組指針指針數組是一些非常重要但又容易混淆的
    的頭像 發表于 08-10 08:11 ?990次閱讀
    面試常考+1:函數<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>
    百家乐官网对付抽水| bet365 体育在线uo| 宝龙百家乐官网的玩法技巧和规则 | 百家乐官网浴盆博彩通排名| 大发888赌场网址| 百家乐官网平玩法这样| 百家乐官网有技巧么| 全讯网3344111.com| 百家乐21点| 老虎机破解器| 百家乐官网园蒙特卡罗| 任我赢百家乐官网自动投注分析系统 | 赌场百家乐官网破解| 娱乐城注册送钱| 如何胜百家乐的玩法技巧和规则| 在车库做生意风水| 天地人百家乐官网现金网| 大发888九州娱乐城| 百家乐百家乐视频| 澳门百家乐官网官网站| 88真人娱乐城| 百家乐游戏开户网址| 百家乐的路单怎样看| 网上百家乐官网的赌博网站| 许昌县| 德州扑克总督| 免费百家乐倍投| 百家乐试用软件| 金盾百家乐官网网址| 在线博彩网| 水果机技巧规律| 怎样玩百家乐的玩法技巧和规则| 百家乐平台哪个好本站所有数据都是网友推荐及提供 | 网络百家乐官网开户网| 永利高百家乐官网信誉| 博彩娱乐城| 网上百家乐乐代理| 网络百家乐内幕| 牌九百家乐官网的玩法技巧和规则| 澳门百家乐官网怎赌才能赚钱 | 百家乐官网视频游戏冲值|