1. 程式人生 > >C++之指標陣列和陣列指標的區別---補充(9)《Effective C++》

C++之指標陣列和陣列指標的區別---補充(9)《Effective C++》

指標陣列:
首先這是一個數組,陣列中的值型別是指標,通常表現為:

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:這段程式碼有問題,因為編譯器一直再報陣列越界的問題,不過暫時還沒有看出什麼問題,還望各位不吝賜教。