關於將陣列位址賦給指標的問題

2021-09-25 18:57:52 字數 2009 閱讀 2494

對於int (p)[3];

這條語句宣告了:p是乙個指向乙個包含3個int值的陣列的指標。

如下面對p賦值的例子:

#include

#include

#include

intmain();

int (

p)[3];

p = &a;

printf(

"%d %d %d",**p,(

p+1),(

p+2));

這段程式的結果:

1 2 3

又比如:

#include

#include

#include

intmain

(),,};

int (

p)[2];

p=&a[

0];printf(

"%d %d\n",**p,(

p+1)); //陣列第一行

printf(

"%d %d\n",**(p+

1),((p+

1)+1));

//陣列第二行

printf(

"%d %d\n",**(p+

2),(*(p+

2)+1));

//陣列第三行

}

這段程式結果為:

1 23 4

5 6由於無論是幾維的陣列在記憶體中都是占有邏輯連續的,線性的儲存空間。所以:

#include

#include

#include

intmain

(),,};

int (

p)[2];

p=a;

printf(

"%d %d\n",(

p+2),(

p+3));//由於陣列是線性儲存的,

}

由於陣列是線性儲存,在記憶體中的邏輯位置如下:

a

[0][0]

a[0]

[1]a

[1][0]

a[1]

[1]a

[2][0]

a[2]

[1]

對於(p+2)操作,指標按順序移到了第三個int單元,也就指向第2行的第乙個資料了。(詳見《c primer plus》268頁)

所以這段程式結果為:

3 4總之,p指向乙個陣列,解引用後是乙個陣列的位址(解引用之後才會得到陣列首元素的位址)。

同時也可以利用指標和陣列的關係來讓函式返回乙個二維陣列:

例如:

#include

#include

#include

int (

fun(int b[2]))[2]

intmain

()

,,};

int (

p)[2];

p = fun(a);

printf(

"%d %d\n",**p,(

p+1));

printf(

"%d %d\n",**(p+

1),((p+

1)+1));

printf(

"%d %d\n",**(p+

2),((p+

2)+1));

return

0;

}

這段程式的結果是:

1 23 4

5 6注意:

以int (*p)[2];方式定義時,p變數所指向的目標就同時被確定為乙個長度是2的陣列。而以int **p;方式定義時c僅僅將p解釋為乙個位址的位址,並不理解其指向的目標的資料結構(是乙個長度是2的陣列)。

關於陣列位址,指標

1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 ...

關於陣列位址問題

c語言中 指標 是算是比較難的乙個問題,而 指標 就是 位址 知道陣列的位址問題,才能在用指標陣列的時候得心應手。下面是一段 include int main int b 2 3 printf p t p n a,a 1 printf p t p n a,a 1 printf p t p n a 0...

VBA研究 如何將單元格資料賦給陣列

將工作表中的資料賦給陣列或者將陣列的資料賦給工作表,一般有兩種,一種是迴圈的方法,乙個乙個的傳,這種方法一般用於需要對每個資料特別處理的場合,另一種是一次性用賦值語句傳,就速度來說,第二種方法要快得多。看下面例程 sub tt dim arr1 240000,4 dim arr2 lineno a1...