0

C++ 配列が C++ の const ポインターであることは本当ですか?

http://www.cplusplus.com/forum/articles/10/#msg1381

では、それらがポインターである場合、なぜxと同じなのでしょうか?&x

#include<iostream>
using namespace std;

int main() {
    int x[5];
    int *y = new int[5];

    cout << "&x : " << &x << endl;
    cout << "x : " <<  x << endl;
    cout << endl;
    cout << "&y : " << &y << endl;
    cout << "y : " <<  y << endl;
    return 0; 
}

出力:

&x:  0xbfec4ccc
x :  0xbfec4ccc

&y:  0xbfec4ce0
y :  0x8961008

上記のコードの ideone へのリンク: http://ideone.com/3JRZd

4

5 に答える 5

4

グラハムは間違っていて、彼が何について話しているのかわかりません。配列とポインターは 2 つの異なるものです。

于 2012-04-10T23:16:03.353 に答える
3

いいえ、配列が C++ の const ポインターであることは事実ではありません。実際、1つのファイルに含まれている場合

extern int* const a;

もう一方には次が含まれます

int a[10];

同じスコープで両方のファイルを結合すると、奇妙なエラーが発生します。

ただし、ほとんどの場合、配列はポインターに分解されます。より正確には、右辺値コンテキストで配列を使用すると、最初の要素へのポインターに暗黙的に変換されます。これは、2 番目のリンクの例で x に起こることです。もちろん、配列の最初の要素は配列と同じアドレスにあるため、 と の両方が同じアドレスとしてx出力&xされます。ただし、これらは型が異なるため、同じポインタではないことに注意してください。このコンテキストは、xは に崩壊します。int*int&xint(*)[5]int

両方が異なることがわかる別のケースは、次のような配列への参照を取る関数です。

void f(int (&arr)[5]);

xこの関数に渡すことはできますが(タイプが であるためint[5])、書き込み時に取得する&xポインターも渡すことはできません。yint* y = x

于 2012-04-10T23:16:45.343 に答える
1

コード

int array[3];

と同じではありません

int const *array=new int[3];

単純な理由ですが、単一の理由ではありませんdelete [] array。2番目のケースでは電話をかける必要があります。

于 2012-04-10T23:19:04.217 に答える
1

ばかげたアナロジー:

住所1, Main Streetについて考えてみましょう。
メインストリートの始まりを「1、メインストリート」と呼ぶことができるにもかかわらず、通り「メインストリート」と同じものではありません。実際、その通りの端で誰かに会いたい場合は、住所「メイン ストリート 1 番地」と書かれたメモを渡して、どこで待っているかを示すことができます。メインストリートの一部を紙に描きます(または、抽象化レイヤーを導入できる場合は、「X」が付いた地図を渡します)。

1, Main Streetはもちろん、Main Street の始まりの住所であるだけでなく、Main Streetの最初の家の住所であります - これはあなたの印刷物がx示すものです - しかし、家も住所も通りではありません。

于 2012-04-11T14:34:11.983 に答える
-1

はい、そうです。

ポインタは常にアドレスであるため、&valueはどのタイプのポインタでも同じである必要があります。

また、あなたはこのようなことをすることができます

int number[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int *pNumbers = number;

[編集]他の答えとは違うかもしれません...しかし、私はいつもこれが真実であるという印象を受けました[編集] 「ポインタと配列」の下のhttp://www.cplusplus.com/doc/tutorial/pointers/も参照してください

于 2012-04-10T23:17:40.803 に答える