私はこれを投稿することを躊躇しますが、問題を引き起こしません。
脚本:他の回答のほとんどは間違っています:あなたが作成したものはではなく、の配列へのポインタです。これは、配列の最初の要素を参照するint
へのポインタです。
私はあなたの質問に間違った言葉遣いを使用したことのほとんどの問題であるという簡単な理由でそれを投稿するのをためらっています - int
へのポインタはほぼ確実にあなたが望んだと思ったものです。本当に得た。
しかし、配列へのポインタとしてのものがあります。ポインタの数学(添え字付きを含む)を行う場合、配列へのポインタは、指している配列のサイズを増やして動作するため、めったに役に立ちません。あなたの場合、10 int
を割り当てます。配列内のint
を参照するには、ポインタからサブスクリプトを使用することができます。したがって、theName[0]
は、最初のint
、theName[1]
から2番目のint
などを指します。
(たとえば)配列の配列を操作していて、一度にその行全体を移動するポインタを必要とする場合は、配列へのポインタを実際に使用できるようにする必要があります。そのため、ptr[0]
が最初の行、ptr[1]
の2番目の行などとなりました。例えば: - (定義により)sizeof(char) == 1
ので、に少し簡単です
#include <iostream>
static const int x = 20;
static const int y = 10;
int main() {
char data[y][x];
auto ptr_array = &data[0];
char *ptr_char = &data[0][0];
std::cout << "Address of entire array: " << (void *)data << "\n";
std::cout << "char *[0] = " << (void *)ptr_char << "\n";
std::cout << "char *[1] = " << (void *)(ptr_char+1) << "\n";
std::cout << "array *[0] = " << (void *)ptr_array << "\n";
std::cout << "array *[1] = " << (void *)(ptr_array+1) << "\n";
return 0;
}
私は数学が少しより明らかにするために(代わりにint
の)char
の配列の配列で動作するようにこれを変更しました数学を解く私は私のマシン上でこのコードを実行すると、私が手アドレスは以下のとおりです。あなたが見ることができるように
Address of entire array: 0047FD2C
char *[0] = 0047FD2C
char *[1] = 0047FD2D
array *[0] = 0047FD2C
array *[1] = 0047FD40
は、ptr[0]
は、全体として、配列のいずれかの方法のアドレスを保持しています。しかし、char
へのポインタでは、ptr[1]
は1つ大きいアドレスを保持します。しかし、配列へのポインタは、アドレス0x40-0x2C = 0x14 = 20 greaterを保持します。これは、配列(20)に与えたXの次元に適合します。言い換えれば、実際には配列へのポインタを持っており、このポインタ上のポインタの算術演算(または同様に、添え字付き)は、一度に配列全体に関して実行されます。
私は繰り返しますは、しかし:私たちはあなたがほぼ確実代わりstd::vector
を使用しなければならないという事実を無視するならば、少なくとも、あなたが得たあなたが望んでいたタイプとタイプが両方pointer to int
ました。 pointer to array
のようなタイプですが、ほぼ確実にではありません。本当に欲しいですか。
本当に良い理由がない限り、たぶん 'std :: vector'を使うべきでしょう。 –
このような小さな配列でヒープ割り当てを行うことはできません。 – chikuba