亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言 數組指針詳解及示例代碼

2020-01-26 14:27:53
字體:
來源:轉載
供稿:網友

數組(Array)是一系列具有相同類型的數據的集合,每一份數據叫做一個數組元素(Element)。數組中的所有元素在內存中是連續排列的,整個數組占用的是一塊內存。以int arr[] = { 99, 15, 100, 888, 252 };為例,該數組在內存中的分布如下圖所示:

定義數組時,要給出數組名和數組長度,數組名可以認為是一個指針,它指向數組的第 0 個元素。在C語言中,我們將第 0 個元素的地址稱為數組的首地址。以上面的數組為例,下圖是 arr 的指向:

下面的例子演示了如何以指針的方式遍歷數組元素:

#include <stdio.h>int main(){ int arr[] = { 99, 15, 100, 888, 252 }; int len = sizeof(arr) / sizeof(int); //求數組長度 int i; for(i=0; i<len; i++){  printf("%d ", *(arr+i) ); //*(arr+i)等價于arr[i] } printf("/n"); return 0;}

運行結果:

99  15  100  888  252

第 4 行代碼用來求數組的長度,sizeof(arr) 會獲得整個數組所占用的字節數,sizeof(int) 會獲得一個數組元素所占用的字節數,它們相除的結果就是數組包含的元素個數,也即數組長度。

第 8 行代碼中我們使用了*(arr+i)這個表達式,arr 是數組名,指向數組的第 0 個元素,表示數組首地址, arr+i 指向數組的第 i 個元素,*(arr+i) 表示取第 i 個元素的數據,它等價于 arr[i]。
arr 是int*類型的指針,每次加 1 時它自身的值會增加 sizeof(int),加 i 時自身的值會增加 sizeof(int) * i,這在《指針變量的運算》中已經進行了詳細講解。

我們也可以定義一個指向數組的指針,例如:

int arr[] = { 99, 15, 100, 888, 252 };
int *p = arr;

arr 本身就是一個指針,可以直接賦值給指針變量 p。arr 是數組第 0 個元素的地址,所以int *p = arr;也可以寫作int *p = &arr[0];。也就是說,arr、p、&arr[0] 這三種寫法都是等價的,它們都指向數組第 0 個元素,或者說指向數組的開頭。

如果一個指針指向了數組,我們就稱它為數組指針(Array Pointer)。

需要注意是,數組本身沒有類型,數組元素才有類型,p 指向的數組元素是 int 類型,所以 p 的類型必須也是int *。

反過來想,p 并不知道它指向的是一個數組,p 只知道它指向的是一個整數,究竟如何使用 p 取決于程序員的編碼。

更改上面的代碼,使用數組指針來遍歷數組元素:

#include <stdio.h>int main(){ int arr[] = { 99, 15, 100, 888, 252 }; int i, *p = arr, len = sizeof(arr) / sizeof(int); for(i=0; i<len; i++){  printf("%d ", *(p+i) ); } printf("/n"); return 0;}

數組在內存中只是數組元素的簡單排列,沒有開始和結束標志,在求數組的長度時不能使用sizeof(p) / sizeof(int),因為 p 只是一個指向 int 類型的指針,編譯器并不知道它指向的到底是一個整數還是一系列整數(數組),所以 sizeof(p) 求得的是 p 這個指針變量本身所占用的字節數,而不是整個數組占用的字節數。

也就是說,根據數組指針不能逆推出整個數組元素的個數,以及數組從哪里開始、到哪里結束等信息。

上節我們講到,對指針變量進行加法和減法運算時,是根據數據類型的長度來計算的。如果一個指針變量 p 指向了數組的開頭,那么 p+i 就指向數組的第 i 個元素;如果 p 指向了數組的第 n 個元素,那么 p+i 就是指向第 n+i 個元素;而不管 p 指向了數組的第幾個元素,p+1 總是指向下一個元素,p-1 也總是指向上一個元素。

更改上面的代碼,讓 p 指向數組中的第二個元素:

#include <stdio.h>int main(){ int arr[] = { 99, 15, 100, 888, 252 }; int *p = &arr[2]; //也可以寫作 int *p = arr + 2; printf("%d, %d, %d, %d, %d/n", *(p-2), *(p-1), *p, *(p+1), *(p+2) ); return 0;}

運行結果:

99, 15, 100, 888, 252

引入數組指針后,我們就有兩種方案來訪問數組元素了,一種是使用下標,另外一種是使用指針。

1) 使用下標

也就是采用 arr[i] 的形式訪問數組元素。如果 p 是指向數組 arr 的指針,那么也可以使用 p[i] 來訪問數組元素,它等價于 arr[i]。

2) 使用指針

也就是使用 *(p+i) 的形式訪問數組元素。另外數組名本身也是指針,也可以使用 *(arr+i) 來訪問數組元素,它等價于 *(p+i)。

不管是數組名還是數組指針,都可以使用上面的兩種方式來訪問數組元素。不同的是,數組名是常量,它的值不能改變,而數組指針是變量(除非特別指明它是常量),它的值可以任意改變。也就是說,數組名只能指向數組的開頭,而數組指針可以先指向數組開頭,再指向其他元素。

更改上面的代碼,借助自增運算符來遍歷數組元素:

#include <stdio.h>int main(){ int arr[] = { 99, 15, 100, 888, 252 }; int i, *p = arr, len = sizeof(arr) / sizeof(int); for(i=0; i<len; i++){  printf("%d ", *p++ ); } printf("/n"); return 0;}

運行結果:

99  15  100  888  252

第 8 行代碼中,*p++ 應該理解為 *(p++),每次循環都會改變 p 的值(p++ 使得 p 自身的值增加),以使 p 指向下一個數組元素。該語句不能寫為 *arr++,因為 arr 是常量,而 arr++ 會改變它的值,這顯然是錯誤的。

關于數組指針的謎題

假設 p 是指向數組 arr 中第 n 個元素的指針,那么 *p++、*++p、(*p)++ 分別是什么意思呢?

*p++ 等價于 *(p++),表示先取得第 n 個元素的值,再將 p 指向下一個元素,上面已經進行了詳細講解。

*++p 等價于 *(++p),會先進行 ++p 運算,使得 p 的值增加,指向下一個元素,整體上相當于 *(p+1),所以會獲得第 n+1 個數組元素的值。

(*p)++ 就非常簡單了,會先取得第 n 個元素的值,再對該元素的值加 1。假設 p 指向第 0  個元素,并且第 0 個元素的值為 99,執行完該語句后,第 0  個元素的值就會變為 100。

以上就對C語言 數組指針的資料整理,后續繼續補充相關知識,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级片久久久久久久| 亚洲综合成人婷婷小说| 国产日韩精品视频| 亚洲a级在线播放观看| 日本最新高清不卡中文字幕| 国产精品18久久久久久首页狼| 欧美黑人视频一区| 亚洲欧美成人精品| 日韩av最新在线| 狠狠躁夜夜躁久久躁别揉| 亚洲一区国产精品| 国产精品一区二区久久国产| 久久在精品线影院精品国产| 日韩欧美亚洲范冰冰与中字| 日本老师69xxx| 日韩h在线观看| 亚洲最新在线视频| 欧美福利小视频| 久久人人爽亚洲精品天堂| 欧美在线亚洲一区| 夜夜嗨av一区二区三区免费区| 国产有码在线一区二区视频| 久久综合五月天| 亚洲图片欧洲图片av| 中文字幕亚洲一区二区三区五十路| 久久久久久久久久久网站| 欧美国产日韩一区二区三区| 精品亚洲一区二区三区在线观看| 91精品国产91久久久久久吃药| 欧美国产高跟鞋裸体秀xxxhd| 午夜精品久久17c| 日韩在线观看免费全| 亚洲一区av在线播放| 国产有码在线一区二区视频| 成人免费在线视频网站| 欧美视频国产精品| 欧美性生活大片免费观看网址| 日韩av电影在线免费播放| 午夜精品一区二区三区视频免费看| 亚洲一级免费视频| 久久视频在线播放| 2018国产精品视频| 久久亚洲国产精品成人av秋霞| 亚洲最新在线视频| 亚洲美女在线视频| 色综合视频网站| 国产精品久在线观看| 国产视频精品一区二区三区| 国产精品爽爽ⅴa在线观看| 欧美午夜精品久久久久久久| 成人黄色av播放免费| 欧美日韩精品在线视频| 亚洲xxxxx性| 成人国产精品一区| 狠狠躁夜夜躁人人躁婷婷91| 亚洲一区av在线播放| 亚洲黄色av网站| 亚洲美女又黄又爽在线观看| 日韩电影在线观看中文字幕| 亚洲人午夜精品| 午夜精品一区二区三区在线播放| 亚洲va久久久噜噜噜久久天堂| 日韩欧美亚洲成人| 亚洲性xxxx| 国产有码在线一区二区视频| 日韩av在线免播放器| 日韩欧美精品网站| 国产精品第1页| 欧美成人国产va精品日本一级| 亚洲伊人一本大道中文字幕| 最新日韩中文字幕| 亚洲天堂av在线免费观看| 亚洲а∨天堂久久精品9966| 日韩中文字幕视频在线观看| 久久成年人免费电影| 亚洲一区二区三区乱码aⅴ| 欧美又大又硬又粗bbbbb| 91天堂在线视频| 亚洲欧美日韩区| 成人国产在线视频| 欧美国产视频一区二区| 日日骚av一区| 91精品国产91| 欧美成人黑人xx视频免费观看| 久久精品这里热有精品| 狠狠操狠狠色综合网| 国产免费一区视频观看免费| 国产性色av一区二区| 久久精品国产亚洲精品| 亚洲第一网站男人都懂| 日韩福利伦理影院免费| 中国人与牲禽动交精品| 亚洲色图欧美制服丝袜另类第一页| 黄网动漫久久久| 久久久久国产精品www| 亚洲网站在线观看| 91精品免费视频| 久久久久久伊人| 国内精品视频在线| 国产成人精品在线观看| 一本大道亚洲视频| 精品欧美国产一区二区三区| 国产91精品黑色丝袜高跟鞋| 亚洲欧美日本另类| 亚洲自拍欧美色图| 日韩精品在线电影| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲精品久久视频| 日韩中文字幕在线视频| 91精品在线影院| 免费99精品国产自在在线| 国产精品高潮呻吟久久av黑人| 欧美日韩免费看| 91精品国产免费久久久久久| 91性高湖久久久久久久久_久久99| 国产精品三级网站| 国产成人精品最新| 欧美丰满老妇厨房牲生活| 亚洲国产精品99| 中文字幕视频在线免费欧美日韩综合在线看| 成人激情视频小说免费下载| 日韩欧美在线国产| 成人黄色免费片| 亚洲精品永久免费| 久久久久久中文| 中文字幕亚洲综合久久| 日韩中文在线中文网三级| 日韩h在线观看| 国精产品一区一区三区有限在线| 日产日韩在线亚洲欧美| 在线观看日韩www视频免费| 亚洲mm色国产网站| 91精品视频免费看| 成人啪啪免费看| 亚洲国产福利在线| 国产精品爽爽爽爽爽爽在线观看| 最新日韩中文字幕| 国产精品激情自拍| 成人做爰www免费看视频网站| 国产成人精品国内自产拍免费看| 亚洲国产高清福利视频| 亚洲一级免费视频| 九色精品美女在线| 亚洲精品视频免费在线观看| 久久国内精品一国内精品| 欧美日韩国产限制| 亚洲二区在线播放视频| 亚洲一区二区免费| 久久久国产精彩视频美女艺术照福利| 搡老女人一区二区三区视频tv| 亚洲精品成人av| 日韩欧美黄色动漫| 国产精品福利网站| 久久免费精品视频| 成人激情在线观看| 91夜夜揉人人捏人人添红杏| 欧美成人午夜激情在线| 久久夜精品va视频免费观看| 亚洲国产精品一区二区久| 国语自产在线不卡| 久久久久www| 日韩在线观看成人| 亚洲一区二区精品| 久久久久久com|