c語言指標初探 一 指標與陣列

2021-06-23 06:47:13 字數 3276 閱讀 8933

一 陣列名指標

c++編譯器將陣列名解釋為指標

#include using namespace std;

int main()

cout<<"sz:"<

編譯器將陣列名解釋為陣列記憶體區域的首位址,對一維陣列來說要實現對某個元素的訪問,既可以用陣列名+下標的形式,也可以用間接引用*(陣列名+偏移)

陣列元素的指標形式:

指向陣列的指標

陣列名可以當指標來使用,但是陣列名是常量,其值是不變的,c++不允許修改陣列名的值,所以陣列名不是很靈活。

陣列名指標恆指向陣列所佔記憶體區域的第乙個位元組,對一維陣列來說陣列名指標指向第0個元素,對多維陣列來說,陣列名指標指向第[0][0][0].....[0]個元素。

指向陣列的指標:

#include using namespace std;

int main()

p=sz; //p=&sz[0]

for (int i=0; i<5; i++)

return 0;

}

如果陣列是多維陣列,有兩種指標宣告方式:普通指標形式,陣列名試用法

1.普通指標形式

#include using namespace std;

int main()}}

p=a[0][0];

for (int i=0; i<2; i++)}}

return 0;

}

初始化指標p時有以下幾種方式,是其指向陣列所佔記憶體單元的首位元組

int *p=&a[0][0][0];

int *p=a[0][0];

int *p=(int*)a[0];

int *p=(int*)a;

在訪問a[i][j][k]時採用了語句

*(p+3*

4*i+

4*j+k),解釋一下:要訪問a[i][j][k],那麼相當於指標要跳過a[i][j]的所有元素再訪問第k個元素

每個a[i]對應了3*4個元素(j*k),每個a[i][j]對應了4個元素(k)。其實多維陣列在記憶體中也是線性儲存的,要訪問後邊的元素,需要跳過前面的元素。(個人理解,若有錯,請指出,謝謝)。不能用*(*(*(p+i)+j)+k)訪問元素喲,原因在於p是普通的int指標,對p的算術運算,指標在記憶體中的移動單位只取決於int型資料的大小,所以訪問不到正確地元素啦,如果想要使用這種形式,需要指出第二維開始的大小,這就是陣列名試用法。

2.陣列名試用法

#include using namespace std;

int main()}}

p=a;

for (int i=0; i<2; i++)}}

return 0;

}

*(*(*(p+i)+j)+k)
可以直接寫成p[i][j][k],指標也可以當陣列用,但對宣告的普通指標,這種用法是非法的。

陣列指標

(也稱行指標)
定義 int (*p)[n];因為的優先順序比*高,不加括號的話p要先與結合就成了指標陣列了,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。

如要將二維陣列賦給一指標,應這樣賦值:


int a[3][4];
  

int(*p)[4];  //該語句是定義乙個陣列指標,指向含4個元素的一維陣列。

p=a;       //將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0]
 .      

p++;      //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]

所以陣列指標也稱指向一維陣列的指標,亦稱行指標。

#includeint a[100][100];

int main(void)

指標陣列
定義 int *p[n];
優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1是錯誤的,這樣賦值也是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指標變數可以用來存放變數位址。但可以這樣 *p=a[0]; 這裡*p表示指標陣列第乙個元素的值,a的首位址的值。


如要將二維陣列賦給一指標陣列:

int *p[3];
 int a[3][4];


for(i=0;i<3;i++)

這裡int *p[3] 表示乙個一維陣列內存放著三個指標變數,分別是p[0]、p[1]、p[2]
所以要分別賦值。

這樣兩者的區別就豁然開朗了,陣列指標只是乙個指標變數,似乎是c語言裡專門用來指向二維陣列的,它占有記憶體中乙個指標的儲存空間。指標陣列是多個指標變數,以陣列形式存在記憶體當中,占有多個指標的儲存空間。
還需要說明的一點就是,同時用來指向二維陣列時,其引用和用陣列名引用都是一樣的。
比如要表示陣列中i行j列乙個元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]。

#include#include int main()

}for (int i=0; i<5; i++)

for (int i=0; i<5; i++)

printf("\n");

}return 0;

}

指標陣列可以直接為其分配空間,就成了二維陣列了。

#include#include int main()

for (int i=0; i<5; i++)

}for (int i=0; i<5; i++)

printf("\n");

}return 0;

}

利用二級指標

#include#include //動態分配二維陣列

int main()

{

int **p; //二級指標

int a,b;

int i,j;

printf("請輸入二維陣列大小a,b:");

scanf("%d%d",&a,&b);

p=(int **)malloc(sizeof(int*)*a); //這裡讓二級指標p成為了指標陣列了

for(i=0; i

優先順序:( )  >     >  *

C語言指標初探 一 指標與函式

1.通過指標引數申請動態記憶體。2 利用函式返回值申請動態記憶體。3 返回棧記憶體的 或靜態儲存區的 指標或引用。以上知識請參考 記憶體管理。4 函式引數的三種傳遞方式 1 值傳遞 這個應該簡單吧,來看個經典程式 include include using namespace std void sw...

指標與陣列(一) 指標認知

一 定義與初始化 1.如何理解指標?1 指標是變數。2 指標是乙個位址,指向的是個型別。3 指標指向的是位址,位址指向的是內容。4 指標的指標,是面對於指標的變數。5 指標型別的位元組長度由作業系統決定 32位作業系統為4位元組,64位作業系統為8位元組 2.定義指標的幾種規範 int p 重在表示...

c語言與指標 (一)指標與變數

寫在前面 指標是學習c語言時,最讓人頭痛的乙個難題。但是指標不僅是c語言的精髓,它還貫穿整個計算機底層儲存與訪問方式。指標實際上就是位址,指標變數用來存放指標 位址 指標變數也是一種變數,它和不同的變數同樣要佔一定的儲存空間。但指標變數與不同的變數不同之處在於,指標的儲存空間存放的不是不同的資料,而...