日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于一维数组和二位数组的数组指针

發(fā)布時(shí)間:2025/3/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于一维数组和二位数组的数组指针 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 一維數(shù)組
?????????? c語言中, 數(shù)組占用的空間是一組連續(xù)的物理內(nèi)存空間.

?????????? 所以對(duì)于1維數(shù)組來講,只需要知道數(shù)組頭1個(gè)元素的地址, 就可以逐個(gè)地得出各個(gè)元素的值了.

例子:
????????? 首先定義1個(gè)1維數(shù)字型數(shù)組, 并且賦值.
????????? int A[10]={10,1,2,3,4,5,6,7,8,9};

????????? 這里說明一下, c語言中大部分情況下如上面這個(gè)語句這樣, 定義1個(gè)數(shù)組的同時(shí)就對(duì)它賦值了, 這是最方便的.
????????? 也可以先定義再賦值.
????????? 如
????????? int A[10];???????? A[0]=10; A[1]=2;........
????????? 但是不能用A={10,1,2,3,4,5,6,7,8,9}; 會(huì)編譯失敗~


????????? 跟住定義1個(gè)指針.
????????? int *p;

????????? 這時(shí)這個(gè)指針p只是1個(gè)空指針, 所以下一步就是給這個(gè)指針賦值.
??????? p=A;??????????? //意思就是將數(shù)組A的頭部地址賦值給指針p

????????? 注意 : 對(duì)于一般的變量, 要把它的地址賦值給指針,必須使用尋址符"&", 例如p=&a, 但是對(duì)于數(shù)組變量來講, 是不需要尋址符的, 直接p=A就ok了.

???????? 原因是A這個(gè)數(shù)組名字本身是1個(gè)指針. 它指向數(shù)組A第1個(gè)元素A[0]的地址, 下面會(huì)詳細(xì)講解的啦~


???????? 這時(shí)指針p的值是A的頭1個(gè)元素的地址.
???????? printf("A[0] is %d\n", *p);?? //這時(shí)去訪問p指針指向的值, 就是指向數(shù)組A的第1個(gè)元素啊, 所以就是A[0], *p==10了

???????? 如果想訪問下1個(gè)元素的值A(chǔ)[1],? 則指針必須指向一下元素的地址:
???????? p+=1;????? //意思并不是指針的值加1, 而是指指針?biāo)赶虻牡刂分赶蛳聰?shù)組1個(gè)元素的地址.同理p+i, 就是指向下i個(gè)元素的地址了.
??????????????????????? //實(shí)際上, 假如p是1個(gè)指針, 那么p+i 等價(jià)與p+ (i 乘以 p所指向元素的字節(jié)長度)
??????
這時(shí)再對(duì)指針p取值, 就得到A[1]的地值了.
???????? printf("A[1] is %d\n", *p); //同理再執(zhí)行p+1;, 就得到A[2]的地址...... 一直類推

???????? 這時(shí)要返回具體某個(gè)元素的地址, 則先執(zhí)行
???????? p=A;? //重置p的地址指向A第1個(gè)元素.
?????? p=p+i-1;??? //指向數(shù)組A第i個(gè)元素A[i]

?????

?????? 或者執(zhí)行p=&A[i] ,因?yàn)橛萌≈贩?hào)能將數(shù)字型變量的地址取出來, 這時(shí)p存放的同樣是A[i]的地址. ?????
? ? ? ?? 而不能直接p=A[i] 因?yàn)锳[i]已經(jīng)是1個(gè)數(shù)字型變量了.


??????
如果當(dāng)p指向數(shù)組A最后1個(gè)地址時(shí), 例如p當(dāng)前的值已經(jīng)是&A[9], 如果再執(zhí)行p+1, 那么p繼續(xù)會(huì)已相同幅度指向下1個(gè)內(nèi)存地址, 但是那個(gè)地址是不屬于數(shù)組A的, 要注意啊.

???????? 寫了1個(gè)小測試函數(shù):
?


執(zhí)行結(jié)果如下:
? ?
?
?其實(shí), 好明顯可以看出只要給p賦值,如上圖紅色框框
?p=A;? ??
要獲取任何1個(gè)元素A[i]的值,
只要取值*(p+i)就ok
也就是
*(p+i) = A[i]

這個(gè)特性會(huì)在下面二維數(shù)組上講解的更加深刻

2. 維數(shù)組
?????? 二維數(shù)組跟1維數(shù)組小許區(qū)別, 指針的用法也是不同的.

?????? 其實(shí)二維數(shù)組也可以看成1個(gè)特殊的一維數(shù)組. 只不過1一般的一位數(shù)組里面的元素是數(shù)字,或者字符串...等一般的類型值. 而這個(gè)特殊的一維數(shù)組里面的元素是若干個(gè)長度相當(dāng)?shù)囊痪S數(shù)組.
?
?????? 也就是說二維數(shù)組是1個(gè)由相同長度的若干個(gè)一維數(shù)組組成的數(shù)組.


????? 例如1個(gè)2維數(shù)組B[3][4] 可以看成是由如下3個(gè)長度為4的一維數(shù)組組成.

?????? B0[0]??? B0[1]?? B0[2]?? B0[3]?????????????????????????????????????? //1維數(shù)組B0
?????? B1[0]??? B1[1]?? B1[2]?? B1[3]?????????????????????????????????????? //1維數(shù)組B1
?????? B2[0]??? B2[1]?? B2[2]?? B2[3]????????????????????????????????????? //1為數(shù)組B2


2.1 一般的指針
也做個(gè)例子:
????? 首先定義1個(gè)二位數(shù)組并賦值:
????? int B[3][4] = {{ 0, 1, 2, 3},
??? ??? ????????????????? {10,11,12,13},
??? ??? ????????????????? {20,21,22,23}};

???

???? 跟住定義1個(gè)指針:
? ?? int *p2;

? ?? 同樣,將指針指向整個(gè)數(shù)組的第1個(gè)元素的地址.
? ? ? p2=B[0];? //或者p2=&B[0][0]

===================================================================================================
? ? 這里有點(diǎn)奇怪, 為何不像之前一位數(shù)組那樣直接用B來賦值給指針(p2=B;), 而用B[0]呢?

?? 下面解析一下:
?? a1)???? 對(duì)于一維數(shù)組A[4]來講, 有4個(gè)元素, 他們分別是A[0],A[1],A[2],A[3], 數(shù)組每1個(gè)元素都存放著對(duì)應(yīng)的值.
?? a1-1)? 對(duì)于二位數(shù)組B[3][4]來講, 我們可以將它看成1個(gè)特殊的1維數(shù)組, 這個(gè)數(shù)組有3個(gè)元素, 他們分別是 B[0],B[1],B[2].? 這3個(gè)元素分別是3個(gè)長度為4的子1維數(shù)組 .
??? a2-2) 對(duì)于每1個(gè)子數(shù)組B[x]來講, 它包含4個(gè)元素, 分別是B[x][0],B[x][1],B[x][2],B[x][3], 同樣, 這個(gè)4個(gè)孫元素都存放這對(duì)應(yīng)的值.
??? a2-3) 但是! 對(duì)于父數(shù)組B來講, 他說包含的3個(gè)數(shù)組,只是存放了3個(gè)子數(shù)組的頭部地址. 并不是這3個(gè)子數(shù)組的值啊.?

??? b1)? 所以對(duì)于一維數(shù)組A來講, p=A; 指針p就指向A的首個(gè)元素的地址, 也就是A[0]地址啊.
對(duì)p進(jìn)行取值*p 就是后A[0]的值了.
?????????? A的頭部地址p 取值后*p與A[0]是等價(jià)的
??? b2)? 對(duì)于二維數(shù)組B來講, p=B;指針p同樣就是指向B的首個(gè)元素的地址, 也就是B[0]的地址. 而B[0]的值并不是第1個(gè)元素B[0][0]的值, 而是B[0]這個(gè)子1維數(shù)組的首個(gè)元素的地址, 也就是B[0][0]的地址.
??????????
?? 也就是說p=B; 的話 ===> *p=B[0]?? 而*B[0]才是和B[0][0]等價(jià)的
?? 所以二位數(shù)組, 指針p想獲得第1個(gè)元素的地址的話, 要執(zhí)行
?? P=B[0],? 這樣*p==*B[0]==B[0][0]

? 但是個(gè)人親測, 在64位linux系統(tǒng)上, 用P=B; 語句(B是二維數(shù)組), 一樣可以獲得B[0][0]的地址, 不過在編譯時(shí)會(huì)有如下的警告信息.


===================================================================================================


獲得二維數(shù)組首個(gè)元素地址后,就可以取得對(duì)應(yīng)元素的值了.

printf("B[0][0] is %d\n", *p2);


獲得下1個(gè)元素的地址, 就是B[0][1]的地址

p++;

獲得下B[1][2]的地址,當(dāng)前就地址是B[0][1], 對(duì)于B[i][j]來講, 則i+1, j+1,而這個(gè)二維數(shù)組有4個(gè)列, 則j+4相當(dāng)于i+1,所以:
p+=1*4+1;? //p+=5;

下面以這個(gè)例子編寫了1個(gè)函數(shù):
?
執(zhí)行結(jié)果如下圖:



2.2 二維數(shù)組作地址表示數(shù)組元素
??????? 對(duì)于2維數(shù)組B[3][4]來講, 數(shù)組名字B其實(shí)算是1個(gè)指針,? 它指向了子一維數(shù)組B[0]的地址, 也就是說*B 與B[0]是等價(jià)的, 都是1個(gè)地址,指向元素B[0][0]的地址.
? ? ? ? B---->? B[0] ----->B[0][0]

? ? ? ? 既然B是1個(gè)指針, 指向B[0]的地址,? 那么指針(B+1) 就指向B[1]的地址了, *(B+1) !!注意不是*B+1哦, 與B[1]是等價(jià)的 ,都是指向元素B[0][1] 的地址.

?????? 也就是說,? (B+i )是1個(gè)行數(shù)組指針, 指向 子一維數(shù)組B[i]的地址,? 每當(dāng)這個(gè)指針+1, 那么它就指向下1個(gè)子一維數(shù)組.?
?????? 而*(B+i) 就是B[i]的值的了. 而B[i]的值仍然是1個(gè)地址, 指向B[i][0]的地址, 所以*(B+i) 與 B[i]一樣 仍然是1個(gè)指針啊. 它指向B[i][0].
??????? (B+i) --> B[i] -->B[i][0];???
?????????
????????? *(B+i)
?????? 也可以容易看出, 既然B[i] 是1個(gè)指針, 那么B[i]也可與進(jìn)行指針移動(dòng)運(yùn)算, 即B[i]+j 也是1個(gè)指針, 它指向B[i][j]的地址.
?????? 即:
?????? B[i]+j --> B[i][j]

??????? 而上面提過 B[i] 就是 *(B+i)啊
?????? so:
?????? *(B+i)+j --> B[i][j]?

???????? 也就是說? *(B+1)+j 是1個(gè)指針, 它指向二位數(shù)組B的1個(gè)具體元素B[i][j]的地址
???????? 所以對(duì)這個(gè)指針取值*(*(B+1)+j) (也就是 *(B[i]+j)? 因?yàn)?/strong>*(B+i) == B[i]嘛),???? 就是元素B[i][j]

???????? 亦即系講加如我們想獲取二位數(shù)組B里面的1個(gè)具體的元素B[i][j]的值, 只需要利用指針*(B+i)+j 就ok啦.

下面就是例子:
??????? 首先定義1個(gè)二位數(shù)組并賦值:
???? ? ?? int B[3][4] = {{ 0, 1, 2, 3},
??? ??? ????????????????? {10,11,12,13},
??? ??? ????????????????? {20,21,22,23}};

??????????????

????????? 跟住定義1個(gè)指針:
? ?????? int *p3;


?????????? 這時(shí)我們想獲取B[1][2]的值, 只需要給指針p3 賦值成 指針*(B+1)+2
?????????? p3 = *(B+1)+2
?????????
?????????? 接下來就很方便地獲取B[1][2]的值啦~
?????????? printf("B[1][2] is %d\n", *p3);???? //B[1][2] = 12

????????? 這時(shí)我們又想獲取B[2][1]的值, 只需要給指針p3 賦值成 指針*(B+2)+1
???????? ?? p3 = *(B+2)+1
?????????? printf("B[2][1] is %d\n", *p3);

? ? ? ?? 感覺很方便啦, 避免了無謂的行列換算啦.
????

也寫了1個(gè)函數(shù):
??????????

?
執(zhí)行結(jié)果:

?


??


2.3? 行數(shù)組指針.
??????
上面已經(jīng)提過,對(duì)于二維數(shù)組B來講,? 數(shù)組名(B+i)是1個(gè)指針, 但是(B+i)指向的B[i](也就是*(B+i))? 也是1個(gè)指針.???
???????? 而當(dāng)你定義1個(gè)普通指針p時(shí), p指向的*p 一般是一個(gè)值

???????? 也就是說指針(B+i) 與 普通指針p 所指向的對(duì)象性質(zhì)不同, 1個(gè)是指針, 而另1個(gè)是值.
????????? 也可以說它們是兩個(gè)級(jí)別不同的指針.

????????? 所以說一般我們定義1個(gè)指針p 后.
???????? 不能直接用(B+i) 給p賦值
???????? 例如:
???????? p=B;??? //B是個(gè)二位數(shù)組,??? 如果B是1維數(shù)組的話 p=B;似乎正確的, 因?yàn)樗麄兪峭?jí)別的指針.
???????? p=(B+1);
??????? 都是錯(cuò)誤的.

????? ======================================================================================
?????
而有一種指針, 它的的級(jí)別比一般的指針高一級(jí).? 這就是行數(shù)組指針.
?????
?????? 定義1個(gè)行數(shù)組指針:
?????? int (*p)[4];?? // []里面是4啊

??? ********************************************************************************************
?????? 特別說明:
????????? 這里的int (*p)[4],? 并不是這個(gè)行數(shù)組指針有4個(gè)元素, 這個(gè)4代表的是行數(shù)組指針p指向的行數(shù)組(也就是B的子一維數(shù)組里有4個(gè)元素)

?????????? 也就是說這個(gè)行指針數(shù)組p 是專門for有4個(gè)列的二位數(shù)組的指針

??????????? 如果有個(gè)二維數(shù)組B[3][5],?? 則對(duì)應(yīng)定義的行指針數(shù)組為? int (*p)[5]


??????????? 就如一維數(shù)組的指針*p 一樣,? 這個(gè)(*p)[4] 不是1個(gè)數(shù)組, 而是1個(gè)指針 而這個(gè)指針是指向二位數(shù)組B的1個(gè)子一維數(shù)組的.
?

?

?? ********************************************************************************************
???
?????? 所以這個(gè)高一級(jí)別的指針p 跟二位數(shù)組B 名字指針是同級(jí)別的/
?????? 也就是說可以直接用B對(duì)其賦值.
??????? p=B; ?? 是正確的.
?
??????? 那么:
??????? p==B???????????????? -->?? *B ? ? ? ? == B[0]
????? *p??????????????? -->?? *B[0] == B[0][0]
????? *(*p)== *(*(p+0))?????? == *p[0]?????? ==
B[0][0]???? // *(p+i) = p[i] 見文2.2節(jié)
???? ? ? ? ? ? ? ?? *(*(p+0) +1)? == *(p[0]+1) == B[0][1]
? ???

????? p+1 = B+1?? --> ? ? *(B+1) == B[1]???????????????? //同上 見此文2.2 節(jié)
????? *(p+1)????? -->???? *B[1]???????? == B[1][0]?

????? *(*(p+1)
)???? ==??? *p[1]??????? == B[1][0]
????? *(*(p+1)+1)? ==??? *(p[1]+1)? == ?
B[1][1]
????

???? 通用化:
????? p+i???????????? == B+i????????????? -->?? *(B+i)??? ? ? ? ? ? ? ? ? ? ? ==? B[i]
????? *(p+i) ? ? ?? == *(B+i)???????? -->? *B[i]?????????????????????????? ==? B[i][0]?
????? *(*(p+i))?? == *(*(B+i)) ? ? ==? *p[i]??????? == ?? *B[i]????? ==? B[i][0]
??? ? *(*(p+i)+j) == *(*(B+i)+j)? == ?? *(p[i]+j) == ? *(B[i]+j) == B[i][j]

????? 由上面紅色語句得出
?????

???? *(p+i)+j? == *(B+i)+j --> B[i][j]
???? 就是1個(gè)指向 1個(gè)具體元素B[i][j] 的指針

????

???? 而 *(B+i)+j 就是2.2 節(jié)那個(gè)以行數(shù)組名作的指針嗎?
???? 而且可以看出p 與 B是等價(jià)的?? (p=B;)嘛

???? 沒錯(cuò),? 二位數(shù)組B的名字B 本身就是i個(gè)行數(shù)組指針...
????
????
艸.? 我承認(rèn)自己也很難理解,? 我快吐血了!

?? 總之就是:
????? p[i]--> B[i][0]
????? p[i]+j --> B[i][j]

???? 所以:? *(p[i]+j) = B[i][j]????????????????? //注意這里的P是1個(gè)行數(shù)組指針啊


下面又是一個(gè)例子:
??????? 首先定義1個(gè)二位數(shù)組并賦值:
???? ? ?? int B[3][4] = {{ 0, 1, 2, 3},
??? ??? ????????????????? {10,11,12,13},
??? ??? ????????????????? {20,21,22,23}};


跟住定義1個(gè)行數(shù)組指針:
? ?????? int (*p4)[3];?? //p4是1個(gè)指針名字啦,數(shù)字4毫無其他意義 注意不要寫成 int *p4[3]


直接用數(shù)組名字給指針賦值, 就如一維數(shù)組一樣:
???????? p4=B;

接下來就很方便地獲取B[1][2]的值啦~
?????????? printf("B[1][2] is %d\n", *(p4[1]+2);???? //B[1][2] = 12

這時(shí)我們又想獲取B[2][1]的值,
???????? ???printf("B[2][1] is %d\n", *(p4[2]+1);?? //B[2][1] = 21

國際慣例又寫了1個(gè)函數(shù)如下:


執(zhí)行結(jié)果:





2.4 指針數(shù)組
???? 上面2.2 2.3 節(jié)講的實(shí)質(zhì)上都是行數(shù)組指針,?? 但是c 還有一種叫指針數(shù)組的數(shù)組, 可以用于二維數(shù)組,? 真的要吐了!

???? 假如有個(gè)二維數(shù)組B[3][4]
???? 定義1個(gè)指針數(shù)組:
???? int *p[3]?? //注意跟 行數(shù)組指針 int(*p)[3]的區(qū)別? 定義的語句只差1個(gè)括號(hào), 意義就大大不同了.

???? 這就定義了1個(gè)指針數(shù)組了,?? 它是1個(gè)數(shù)組, 成員是3個(gè)指針(p[0],p[1],p[2]), 他們可以分別用于指向二維數(shù)組B的3個(gè)子一維數(shù)組.
?
???? p=B;?? 這個(gè)賦值是錯(cuò)誤的, 因?yàn)閜是1個(gè)指針數(shù)組, 而數(shù)組名B是1個(gè)行數(shù)組指針啊, 完全不同性質(zhì)的對(duì)象.

???? p[0] = B[0];??
???? 那么p[0] 就指向了B[0]這個(gè)子一維數(shù)組的首元素地址(B[0][0])

???? 所以
???? *p[0] = *B[0] = B[0][0];
???? *(p[0]+1) = *(B[0]+1) = B[0][1];

???? 也就是:
????? *(p[i]+j) = *(B[i]+j) = B[i][j];
????????? p[i]+j --> B[i][j]

???? 又吐一口, 這不是跟行指針數(shù)組一樣嗎?
????
========================================================================================
??? 而因?yàn)槲覀兩厦鎰倓倢?duì)指針數(shù)組p執(zhí)行了賦值 令
???? p[i] = B[i];??? //i=0

???? 首先p[i] 是1個(gè)指針, 而B[0]是1個(gè)子一維數(shù)組,實(shí)際上也是1個(gè)指針, 它指向B[i][0]的地址
???? 也就是說對(duì)于數(shù)組指針p來講:
???? p[i]是1個(gè)實(shí)質(zhì)上的對(duì)象, 他是p數(shù)組的1個(gè)成員. 他是1個(gè)指針

???? 而對(duì)于行數(shù)組指針P來講,
???? 當(dāng)執(zhí)行P=B;時(shí)
???? 得P+i == B+i? ==>?? *(P+i) = *(B+i)

???? 因?yàn)閷?duì)于行指針數(shù)組(B+i)來講
???? (B+i)--> B[i](子一維數(shù)組)的地址??? 所以*(B+i)== B[i]的

??? 而又因?yàn)閜與B是等價(jià)的,都是行數(shù)組指針
??? 所以 *(P+i)== P[i]
??? 也就是說 P[i] 其實(shí)就是 B[i], 也是1個(gè)子一維數(shù)組,也是1個(gè)指針, 指向B[i][0]的地址,

??? 又因?yàn)?p[i] = B[i]; //見前15行
?? 所以

?? P[i]? = p[i]

?? 也即是說 對(duì)于行數(shù)組指針p 和 指針數(shù)組P來講,
?? 雖然它么你的定義方法不同,

?? 但是他們的p[i](P[i])是等價(jià)的.

??? 對(duì)于指針數(shù)組p來講 p[i] 數(shù)組p內(nèi)的一個(gè)元素,是1個(gè)普通指針.

???? 而對(duì)于行指針數(shù)組P來將, P[i] 是通過對(duì)行數(shù)組指針P+i 執(zhí)行*(P+i) 取值得出的.也就是P+i 指向地址的內(nèi)容.
也就是B[i]啦, 而B[i]是1個(gè)數(shù)組名(子一維數(shù)組B[i], 也相當(dāng)與1個(gè)普通指針啦) 所以B[i]與P[i]與p[i]都是等價(jià)的. 前提是已經(jīng)賦值P=B; p[i]=B[i];哦



?
?
???
=======================================================================
????
最后也寫了1個(gè)函數(shù)


執(zhí)行結(jié)果:
?
?

???

總結(jié)

以上是生活随笔為你收集整理的关于一维数组和二位数组的数组指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。