0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)組指針的基本概念與使用

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

數(shù)組指針

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

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

數(shù)組指針:指向數(shù)組的指針

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

基本概念

下面哪個是數(shù)組指針呢?

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

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

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

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

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

1.1、代碼示例

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

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

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

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

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

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

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

1.2、錯誤示范

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

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

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

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

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

arr和&arr的區(qū)別

在進(jìn)一步了解數(shù)組指針之前,我們需要了解arr和&arr的區(qū)別

當(dāng)我們用%p打印arr和&arr時,會發(fā)現(xiàn)它們的結(jié)果是相同的

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

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

并不能!

再來看看下面這串代碼

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

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

&arr+1跳過40個字節(jié),整個數(shù)組的大小

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

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

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

數(shù)組的地址+1,跳過整個數(shù)組的大小

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

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

p接收的是&arr,整個數(shù)組的地址

p1接收arr,數(shù)組首元素的地址

數(shù)組指針的使用

3.1打印一維數(shù)組

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

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

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

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

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

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

3.2、打印二維數(shù)組

假設(shè)我現(xiàn)在需要一個print函數(shù)來打印二維數(shù)組

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

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

當(dāng)我們想用數(shù)組指針的時候,情況就有些變化了

數(shù)組名是數(shù)組首元素的地址

二維數(shù)組的首元素是第一行

二維數(shù)組的數(shù)組名表示第一行的地址

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

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

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

對應(yīng)的數(shù)組指針為int(*)[5]類型

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

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

*p:對p直接解引用

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

相當(dāng)于是二維數(shù)組第一行首元素的地址

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

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

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

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

這一部分和上篇博客指針數(shù)組的內(nèi)容相似

最終的函數(shù)實現(xiàn)如下

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練習(xí):判斷

這一站最重要的就是區(qū)別指針數(shù)組和數(shù)組指針

4.1 int arr[5]

int arr[5];

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

4.2 int*parr[10]

int*parr1[10];

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

所以parr1是指針數(shù)組

4.3 int (*parr2)[10]

int(*parr2)[10];

parr2和*結(jié)合,表示parr2是一個指針

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

所以parr2是一個數(shù)組指針

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

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

[]的優(yōu)先級高于*

parr3先和[]結(jié)合,說明parr3是一個數(shù)組

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

該數(shù)組指針指向的數(shù)組有5個int類型的元素

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

結(jié)語

第三站數(shù)組指針到這里就結(jié)束啦!

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

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68625
  • 數(shù)組指針
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    5234

原文標(biāo)題:【C語言】指針進(jìn)階第三站,數(shù)組指針!

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言中指針數(shù)組數(shù)組指針的區(qū)別

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

    指針基本概念和運算

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

    數(shù)組基本概念

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

    數(shù)組指針的詳細(xì)講解

    數(shù)組指針的詳細(xì)講解
    發(fā)表于 10-16 08:44 ?0次下載

    指針數(shù)組的詳細(xì)資料和實例程序免費下載

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

    詳談數(shù)組指針的區(qū)別與聯(lián)系

    詳談數(shù)組指針的區(qū)別與聯(lián)系
    的頭像 發(fā)表于 06-29 15:18 ?2.2w次閱讀
    詳談<b class='flag-5'>數(shù)組</b>和<b class='flag-5'>指針</b>的區(qū)別與聯(lián)系

    指針數(shù)組數(shù)組指針的區(qū)別

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

    理解函數(shù)指針、函數(shù)指針數(shù)組、函數(shù)指針數(shù)組指針

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

    C語言指針數(shù)組的區(qū)別

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

    二維數(shù)組數(shù)組指針以及指針數(shù)組

    二維數(shù)組數(shù)組指針以及指針數(shù)組
    的頭像 發(fā)表于 08-16 09:02 ?2676次閱讀

    【C語言進(jìn)階】“數(shù)組指針”和“指針數(shù)組”都是啥跟啥?

    【C語言進(jìn)階】“數(shù)組指針”和“指針數(shù)組”都是啥跟啥?
    的頭像 發(fā)表于 08-31 13:21 ?1917次閱讀

    C語言中什么是指針數(shù)組

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

    數(shù)組指針不能混用的情況

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

    數(shù)組指針不相同嗎?數(shù)組指針有哪些區(qū)別

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

    面試常考+1:函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針指針數(shù)組是一些非常重要但又容易混淆的
    的頭像 發(fā)表于 08-10 08:11 ?863次閱讀
    面試???1:函數(shù)<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>函數(shù)、<b class='flag-5'>數(shù)組</b><b class='flag-5'>指針</b>與<b class='flag-5'>指針</b><b class='flag-5'>數(shù)組</b>