C++之指標陣列和陣列指標的區別---補充(9)《Effective C++》
阿新 • • 發佈:2019-01-22
指標陣列:
首先這是一個數組,陣列中的值型別是指標,通常表現為:
template <typename T>
T* Tname[10];
現在我們這兒利用二維陣列進行舉例:
int a[3][4];
int *p[3];
p[0]=a[0];//注意,這兒不能讓p[0]=a/&a[0],因為會發生型別不匹配了,編譯器會提示int(*)[4]->int *型別的實體
p[1]=a[1];
p[2]=a[2];
陣列指標:
首先這是一個指標,指向某種型別的一個數組,通常變現形式為:
template <typename T,int n>
T (*Tname)[n]/T (*) [n] Tname;
現在我們使用二維陣列進行舉例:
int a[3][4];
int (*p)[4];
p=a/&a[0];
p++;
因為優先順序順序:()>[]>*,所以這樣導致了判斷型別到底是陣列指標還是指標陣列。
簡單舉例:
#include <iostream>
#include <string>
using namespace std;
int main(){
int* p = new int[10];
int(*pxx)[10] = (int(*)[10])p;
for (int i = 0; i < 10 ; i++){
*p++ = i;
}
for (int i = 0; i < 10; i++){
*(pxx[i]) = i;
}
for (int i = 0; i < 10; i++){
cout << *(pxx[i]) << endl;
}
return 0;
}
二維陣列舉例:
#include <iostream>
#include <string>
using namespace std;
int main(){
int a[3][4];
int(*p)[4] = a;
for (int i = 0; i < 3; i++){
for (int j = 0; j < 4; j++){
a[i][j] = (i + 1)*(j + 1);
*p[j] = a[i][j];
}
p++;
}
cout << "結束" << endl;
int i = 0;
for (p=a; !(p!=a&&p!=&a[1]&&p!=&a[2]); p++){
for (int j = 0; j < 4; j++){
*p[j] = a[i][j];
cout << *p[j] << ",";
}
i++;
cout << endl;
}
return 0;
}
PS:這段程式碼有問題,因為編譯器一直再報陣列越界的問題,不過暫時還沒有看出什麼問題,還望各位不吝賜教。