在二維陣列傳參時,經常遇到這樣的問題,不能將」int ** 「轉換為」int (*)[5]「,雖然二維陣列a[5][5]的a是二級指標,但是用int **是單純的二級指標,但是二維陣列的a是完全不同的。a[0]表示第一行一維陣列,a[1]表示第二行二維陣列,a是具有結構的,這一點和普通的二級指標具有很大的區別。
int (*p)[5]是陣列指標,又稱為行指標。為了方便記憶,陣列指標可以想成是「二維陣列要用到的指標「好了。
指標p指向乙個由5個元素組成的整形陣列指標。
p+1相對於p的位置移動了5個元素的記憶體單位。
int a[5][5], (*p)[5] = a;
如此一來就將p這個陣列指標指向了二維陣列的a.
char *p[5],就是說p[0],…,p[4]都是指向乙個char型的指標。一般來說,這樣的就是乙個儲存了不同長度的字串陣列罷了。
比如:char *name=
形參:
int maxa(int a, int n)
int maxb(int *a, int n)
以上兩種寫法是一樣的,沒有任何區別。
實參:
int a[10],*p;
p = a;
maxa(a,10)和maxb(p,10)是一樣的。
原因很簡單,傳入的只是個位址,還有並且還有型別,以便編譯器定址用。對於一維陣列,上面兩種寫法是一樣的。
int a[2][3]和int a[3]是等價的,但最多只能省略第一維的大小,不能省略其他維,因為實參傳過來的只是陣列的初始位址,不說明列引數,則無法確定在第幾個元素開始「換行」,即無法確定陣列在記憶體中的位置。
//二維陣列傳參問題示例
//二維陣列傳參問題示例
#include
using
namespace
std;
//方法1:傳遞陣列,注意第二維必須標明
void fun1(int arr[3], int irows)
cout
<< endl;
}cout
<< endl;
}//方法二:一重指標,這種方法和第一種其實是一樣的,只是寫法不同而已。
void fun2(int(*arr)[3], int irows)
cout
<< endl;
}cout
<< endl;
}//方法三:指標傳遞,不管是幾維陣列都把他看成是指標,
void fun3(int*arr, int irows, int icols)
cout
<< endl;
}cout
<< endl;
}//方法4:利用二級指標。不過內部不能直接寫arr[i][j],因為這樣不能正確定址,要模擬編譯器定址。
void fun4(int**arr, int irows, int icols)
cout
<< endl;
}cout
<< endl;
}int main()
, };
int k[2][3][3] = ;
cout
<< "fun1"
<< endl;
fun1(a, 2);
cout
<< endl;
cout
<< "fun2"
<< endl;
fun2(a, 2);
cout
<< endl;
//此處必須進行強制型別轉換
//所以必須強制轉換成指標,如果a是一維陣列則不必進行強制型別轉換
cout
<< "fun4"
<< endl;
fun4((int**)a, 2,3);
//此處必須進行強制型別轉換
//所以必須強制轉換成指標,如果a是一維陣列則不必進行強制型別轉換
cout
<< "fun3"
<< endl;
fun3((int*)a, 2, 3);
cout
<< "fun3"
<< endl;
fun3((int*)k, 3, 3);
cout
<< endl;
}
C C 指標與陣列
目錄 陣列記憶體位址 指標 偏移 指標加減法 指標變數遍歷陣列 取乙個變數的位址 符號 int a 4 a取得變數a的記憶體位址 陣列是一塊連續的記憶體,型別 名字 個數 sizeof 型別 個數,連續的記憶體 區域性變數的陣列,所以這個陣列的記憶體是分配在我們的棧上的 連續的記憶體,由低位址排到高...
C C 陣列與指標
經常使用stl導致陣列與指標都陌生了,複習總結一下 c c 裡指標確實更高效了,也更複雜了 陣列的建立 type t arr name const n type t指數組的元素型別,const n指常量表示式 int arr 10 is ok陣列的初始化 int arr1 10 不進行初始化,存放未...
C C 陣列與指標
include using namespace std int main char pa a cout pacout pa cout pacout pa cout pa signal segmentation fault core dumped return 0 編譯器不識別陣列 陣列就是指標a就是...