天天看點

C++之指針數組和數組指針的差別---補充(9)《Effective C++》

指針數組:

首先這是一個數組,數組中的值類型是指針,通常表現為:

template <typename T>
T* Tname[];
           

現在我們這兒利用二維數組進行舉例:

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[];
    int(*pxx)[] = (int(*)[])p;
    for (int i = ; i < ; i++){
        *p++ = i;
    }
    for (int i = ; i < ; i++){
        *(pxx[i]) = i;
    }
    for (int i = ; i < ; i++){
        cout << *(pxx[i]) << endl;
    }
    return ;
}
           

二維數組舉例:

#include <iostream>
#include <string>
using namespace std;
int main(){
    int a[][];
    int(*p)[] = a;
    for (int i = ; i < ; i++){
        for (int j = ; j < ; j++){
            a[i][j] = (i + )*(j + );
            *p[j] = a[i][j];
        }
        p++;
    }
    cout << "結束" << endl;
    int i = ;
    for (p=a; !(p!=a&&p!=&a[]&&p!=&a[]); p++){
        for (int j = ; j < ; j++){
            *p[j] = a[i][j];
            cout << *p[j] << ",";
        }
        i++;
        cout << endl;
    }
    return ;
}
           

PS:這段代碼有問題,因為編譯器一直再報數組越界的問題,不過暫時還沒有看出什麼問題,還望各位不吝賜教。

參考:http://www.cnblogs.com/mq0036/p/3382732.html

繼續閱讀