-
二維陣列實際上是陣列的陣列,因此指向二維陣列的指標是指向陣列的指標。 考慮到這一點,選擇返回型別很簡單。
由於指向陣列的指標編寫起來很麻煩,因此可以先定義乙個型別,然後使用定義的型別來定義函式返回值型別:
typedef int (*pointertoarray8)[8];
pointertoarray8 ret2darray()static int arr2d[8][8];
return arr2d;
如果不想定義,可以直接寫出來,但好像有些誇張:
int (*ret2darray())8] {static int arr2d[8][8];
return arr2d;
最後,請注意,我在這裡使用的是 arr2d 中的靜態變數,因為自動變數的陣列是在函式返回後釋放的,不能再使用。
-
假設陣列定義如下:int a[2][3];
如果你想使用乙個函式來做到這一點,可以這樣寫,例如:
#include
#include
void func(int a[3])
int i,j;
for (i = 0; i < 2; i++)for (j = 0; j < 3; j++)a[i][j] = i + j;
return;
void print(int a[3])
int i,j;
for(i = 0; i < 2; i++)for(j = 0; j < 3; j++)printf("%d ", a[i][j]);
printf("");
return;
int main()
int a[2][3];
func(a);
print(a);
system("pause");
-
例如,二維陣列是。
int ia[2][3]=;
int (*p)[3]=ia;
就這麼簡單,請注意指標的內部是乙個二維數字。
-
只需返回陣列名稱並自行手動處理下標即可。
-
定義乙個陣列指標,並用指標返回它。
-
int(*p)[10] 定義乙個指向二維陣列的指標 p,為其分配 10 個長度,並將陣列 a 的值分配給 (*p)[10]。
請注意,這裡的 a 陣列是 5 行 10 列,將 (*p)[10] 放入 a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9] 放入 (*p)[0],並以同樣的方式, 把 a[1][0....9] 改為 (*p)[1]。
最後,(*p)[10] 中只有五行值初始化為 a 陣列的值。
在這種情況下,p 和 p[0] 的意思相同,即陣列 a 的起始位址,相當於 cout include
#include "iostream"
using std::cout;
using std::endl;
using std::hex;
void main()
int a[5][10]=;
int (*p)[10]=a;
cout0012feb8
0012feb8
#include
#include "iostream"
using std::cout;
using std::endl;
using std::hex;
void main()
int a[5][10]=;
int (*p)[10]=a;
cout<<*p0012feb8
這就是 p 和 p[0] 之間的區別所在。 由於 *p 不是標頭元素的值,因此它等價於 p[0]。 那麼如何通過 p 獲取第乙個元素的值,顯然,你應該再新增乙個 * 運算子,如下所示:
cout<<*p“ 輸出自然是 1,就像 (*p)[0] 一樣。
-
1. 你的浮點陣列被定義為乙個有 3 行 4 列的二維浮點陣列,陣列的元素是浮點數。 如果你改變格式並寫清楚!
float score[3][4]=,,}
在呼叫期間,score 是陣列的第乙個位址,指向浮點陣列。 陣列的分數 + 1 分。
2. 浮點數 *p 定義指向浮點數的指標。 這個是一維的。
在呼叫期間,浮點數指向 xx。 浮點數。
這兩個定義不同,因此在引數傳遞過程中會發生錯誤。
3. 你的浮點數 (*p)[4] 被定義為指向四個元素的浮點陣列的指標。
在呼叫期間,float 指向由四個浮點數組成的陣列。
在這種情況下,兩個定義是相同的,因此引數傳遞中沒有錯誤。
第四,有個建議,你的程式編寫格式不清晰,不利於你的糾錯修改,應盡量清晰明確,不建議使用簡化的方式來定義引數。
作為軟體工作者,要盡量使程式流暢、格式清晰、易讀,這是軟體工作者最基本的職業素質。
格式化後,程式會更清晰,如下所示:
#include
void main(),search(score,2);
void search(float (*p)[4],int n) *這裡似乎有 float *p 的問題*
printf("");}
-
p[0] 指向陣列 A 的起始位址。
p[9] 字段指標。
-
有兩種方法可以用指標表示二維陣列:
1.動態陣列法。
完全由動態資料組成的二維陣列。 例如,通過首先分配 m 個一維指標空間,然後在每個一維指標上分配 n 個元素的空間,將 n 行和 n 列的 m 的陣列分配給動態二維陣列。
與普通陣列不同,這個動態二維陣列的行之間的位址不是連續的。
#include
int **create(int m, int n) 在行 m 中建立乙個包含 n 列的二維陣列。
2. 通過陣列指標指向現有的二維陣列。
對於已定義的 n 行和 n 列陣列,可以使用指向 n 個元素的陣列指標指向陣列並訪問該陣列。
int a[10][5];
int (*p)[5];每行 5 個元素的陣列指標。
p=a;將 p 點指向 a。
-
二維陣列可以被認為是指向指標的指標,b = **b;
例如:b[2][5];
它是 2 行 5 列的二維陣列,也可以看作是二級指標,第一級儲存行指標,然後每行指標實際上指向 5 列元素。
*(b+i)+j), *b+i) 是先取行指標,然後取 +j 偏移到所需列,然後取 * 的值得到第 i 行中 j 列的資料。
-
是這樣的,int b[2][3]=; 這假設 i=1;
b+1 表示移動到下一行,但它的型別是 (*p)[3](您可以通過將 b+1 分配給 *p[3] 並嘗試再次分配 *p 來了解這一點); 在第乙個星號之後,他指向他剛剛移動到的行中第乙個元素的位址,然後 +j 是 b[1][j] 的位址,水平移動到 j 列,最後乙個星號是取他的值。 這是我的分析。 如果不在裡面新增星號,它是 (b+i)+j,它只會繼續向下移動(行),而不是在列的方向上。
-
* (b+i)+j), (b+i) 是陣列的行位址,* b+i)+j) 是陣列的列位址,整個 * (b+i)+j) 表示 b[i][j] 上的內容!
b[i]+j),b[i]等價於*(b+i),(* b+i))j]等價於b[i][j],不知道大家聽懂不懂?
-
二維陣列本質上是陣列的陣列。
-
在 C 語言中,有兩種基本方法可以將二維陣列作為函式引數傳遞給指標
1. 傳遞“陣列指標”。
include void output( int (*pa)[3], int n ) 這個函式只能輸出乙個 n 行 3 列的二維陣列}void main(),int i; int *pa[2]; for( i=0;i<2;i++ pa[i]=a[i]; output(pa, 2, 3);}
-
a[i] 在形式上是 a 陣列中的第 i 個元素。 如果 a 是一維陣列的名稱,則 a[i] 表示陣列 a 的第 i 個元素所佔據的記憶體單元的內容。 A[i] 有乙個實體地址並占用乙個儲存單元。
但是,如果冰雹陷阱 a 是二維陣列,則 a[i] 是一維陣列的名稱。 它只是乙個位址(就像一維陣列名稱只是乙個指標常量一樣。 a、a+i、a[i]、*a+i)、*a+i) + j、a[i]+j 都是位址。
a[i]+j) 和 *(*a+i)+j) 是二維陣列元素 a[i][j] 的值。
下面是乙個示例:
int a[3][4]=;
a,*a;第 0 行開頭的位址和第 0 行中第 0 列的元素位址 a[0],*a+0);第 0 行,第 0 列,元素位址 a[0], &a[0][0]; 第 0 行中元素的位址以及第 0 行和第 0 列中元素的位址 元素位址 a[1], a+1; 第 1 行 0 元素位址和 1 行前導位址 a[1][0], *a+1)+0;1 列 0 行元素位址 a[2],*a+2);2 行和 0 列元素位址。
a[2],a+2;第 2 行元素開頭的位址。
a[1][0],*a+1)+0);第 1 行的第 0 列中元素的值。
-
這相當於陣列越界後隨機生成的數字對應的位址! p[3] 仍然等於 a[3]。 只是此時 A 陣列已經越界了,編譯器立即給出了數字。
-
p 是指向一維陣列的指標陣列,可以訪問二維陣列。 陣列中的元素數為 4; 如果定義了 int(*p)[3]; int a[3][4] 二維長度將不一致!! 但是,二維陣列元素是連續儲存的,int(*p)[3],並且陣列將作為 3 列訪問,而不是定義的 4 列。
p[3] 超出了 int a[3][4] 的範圍,*p[3] 是預設的隨機值。 *(p[3]+i) i=0,1,2,3 都在 int a[3][4] 的範圍之外。
-
首先,p 是指標陣列名稱,其元素是一級指標,陣列名稱是指向一級指標(即二級指標)的指標。
二維陣列可以被認為是由四個元素組成的一維陣列,其數量為 3。
p 有四個元素,而二維陣列 A 每行只有三個元素,所以相對於 a,p 有乙個越界的陣列,並且 p[3] 的值是乙個隨機值(p[3] = a[0][3],對於 a,a[0][3] 不存在,所以 p[3] 變成乙個隨機位址值,字段指標要小心), 並將指向記憶體中的位址。
-
同行,這個問題困擾了我很久了,我也是新手,所以還是不明白!
p 儲存了 p[0] 的位址,p+1 儲存了 p[1] 的位址!
你應該已經注意到,a 和 a[0] 的內容和位址是完全一樣的,所以只能理解為 a 只是 a[0] 的另乙個名字!
同樣,p 是 p[0] 的別名,而 a+1 和 a+2 都是 a[1]。A[2], p+1, p+2 是 p[1] p[2] 的別稱!
p=a,我們認為運算 a[0] 給出 p[0],p=a,這也意味著 p+1=a+1,p+2=a+2,並將 a[1]a[2] 分配給 p[1]、p[2]。
但是如果沒有 a+3,則不會分配 p+3,因此 p[3] 應該指向陣列後面的一段記憶體,但它不屬於陣列!
我想這就是我目前能說的!
但矛盾還是很多,其中之一就是 a 和 a[0] 的內容和位址是一樣的,為什麼 p=a 改成了 p=a[0],報錯了!
我只是乙個初學者,所以當我以同樣的困惑表達我的意見並讓大師們看到時,我忍不住笑了,慷慨大方!
小夥伴們,一起在女生裡學習吧! 也許有了廣闊的視野,這些問題就會得到解決!
你有什麼問題嗎,也許我們可以討論一下?