2015-11-10 6 views
8

(免責事項:C++のポインタは非常に人気のあるトピックなので、私の前の誰かがすでにこの点を挙げていると信じられていますが、別の参照を見つけることができませんでした。私が間違っている場合はこのスレッドを閉じてください)"address of array"の実用的なケースは何ですか?

私は、配列の最初の要素へのポインタと配列自体へのポインタを区別する多くの例を見てきました。

//pointers to arrays 
#include <iostream> 
using namespace std; 

int main() { 
    int arr[10] = {}; 
    int *p_start = arr; 
    int (*p_whole)[10] = &arr; 

    cout << "p_start is " << p_start <<endl; 
    cout << "P_whole is " << p_whole <<endl; 

    cout << "Adding 1 to both . . . " <<endl; 

    p_start += 1; 
    p_whole += 1; 

    cout << "p_start is " << p_start <<endl; 
    cout << "P_whole is " << p_whole <<endl; 

    return 0; 
} 

出力::ここで一つのプログラムとその出力です

だから
p_start is 0x7ffc5b5c5470 
P_whole is 0x7ffc5b5c5470 
Adding 1 to both . . . 
p_start is 0x7ffc5b5c5474 
P_whole is 0x7ffc5b5c5498 

、予想通り、両方に1を加算することは、異なる結果が得られます。しかし、私はp_wholeのようなもののための実用的な使用を見失う。 arrを使用して取得できるアレイブロック全体のアドレスを取得したら、そのようなポインタを使って何ができますか?

+0

で対

void display(const int(*a)[10]) // const int (&a)[10] seems better here { for (int e : *a) { std::cout << " " << e; } } 

C + +の代わりに配列への参照を使用することができますので、使用はありません。配列への参照は非常に便利です(例:名前に基づいて配列の次元を取得する標準的な実装)。 –

答えて

11

単一配列の場合、私はそこに多くの点があるとは思わない。それが有用になるのは、配列の配列である多次元配列です。サブ配列の1つを指すポインタは行へのポインタで、インクリメントすると次の行へのポインタが得られます。対照的に、内部配列の最初の要素へのポインタは単一の要素へのポインタであり、インクリメントすることで次の要素が得られます。

+0

はい、意味があります!これは反復をはるかに良くするでしょう。 – dotslash

+1

@dotslashと割り当て。 'int **'を "2次元配列"と呼んでいる人がいる場合は、それらを修正して、代わりに 'malloc(COLS * sizeof(int [ROWS]))'に伝えてください。 'int(*)[ROWS]')。連続したメモリを使用し、キャッシュを保存してください! –

+0

@TheParamagneticCroissantチップをありがとう!しかし、 "キャッシュを保存する"という部分は得られませんでした。説明してください。 :) – dotslash

2

int (*)[10]は、それが配列、 の大きさを保つように追加のサイズパラメータを渡さずに機能するためにそれを渡すことint*より「強い」タイプです:

void display(const int* a, std::size_t size) // or const int* end/last 
{ 
    for (std::size_t i = 0; i != size; ++i) { 
     std::cout << " " << a[i]; 
    } 
} 
関連する問題