程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話 數組指針詳解及示例代碼

C說話 數組指針詳解及示例代碼

編輯:關於C++

C說話 數組指針詳解及示例代碼。本站提示廣大學習愛好者:(C說話 數組指針詳解及示例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話 數組指針詳解及示例代碼正文


數組(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說話 數組指針的材料整頓,後續持續彌補相干常識,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved