
No.3ベストアンサー
- 回答日時:
基本的な説明は、ポインタとは、アドレスのことで、配列は、ある変数の要素のあつまりを意味します。
Ex) 文字列100バイトの変数(str)があります。
● 配列 char str[100];
charの要素のデータが100個連続して領域を確保した。
実際は、100バイトの領域が確保されている。 100バイトの領域
● ポインタ char *str;
charの要素で扱う領域の先頭ポインタの変数をstrとして定義した。
実際は、文字列の先頭アドレスを格納さる領域が確保されている。 32bitマシンでは4バイトの領域
ポインタと配列はしまう場所は同じなのでしょうか?
A.基本的には、正解です。 但し、プログラミングの内容によっては、異なります。
Ex) 文字列100バイトの変数(str)があります。
このstrに文字をセットする場合は、下記の方法があります。
char str[100]; 配列
char *strp; ポインタ
●配列の場合
str[0] = 'A'; 配列strの0番目に'A'をセット
str[1] = 'B';
str[2] = 'C';
●ポインタの場合
memcpy(str, "ABC", 3);
☆ memcpyの引数1の属性はポインタです。
配列の名称を引数に指定した場合は、自動的にポインタ扱いです。
又は
*strp = (char *)str;
strp = 'A' strpが指すポインタに'A'をセット
(strp+1)= 'B' strpが指すポインタ+1に'A'をセット
(strp+2) = 'C'
上記のプログミングで、最終結果は同じとなります。
単にしまい方、呼び出し方が違うだけなのでしょうか?
A.基本的には、正解です。 但し、プログラミングの内容によっては、異なります。
ポインタと使えるところでは配列も使えるのでしょうか?
A.基本的には、正解です。 但し、プログラミングの内容によっては、異なります。
そもそもしまわれる場所って何処なのでしょうか?
A.『その領域にセットされる値』と考えて大丈夫です。
No.4
- 回答日時:
ポインタと配列はソースコード上の記述では交換可能なケースも多いですが、全くの別物です。
ポインタはレーザーポインタのように「指すもの」ということで、では何を指すのかと言えば「確保済みのメモリ」です。
従って、ポインタは宣言しただけでは使用できず何かしらのメモリ領域情報を与えてやらなければなりません。
このとき未確保のメモリを指すことが出来ないかと言えば出来る訳ですが、その中身へアクセスしようとした瞬間にまともなOSならアプリケーションエラーを発生させます。
一方の配列は「要素の集合体を整列してアクセス可能にしたもの」であって、宣言と同時に必要な量のメモリが確保されます。
ですから、
int a[10];
a[0] = 0;
と
int *a;
a[0] = 0;
では、コンパイルはどちらも通りますが後者の書き方で作成したプログラムはこの箇所でアプリケーションエラーになります。
No.2
- 回答日時:
・ポインタと配列はしまう場所は同じなのでしょうか?
どういう意味で?
ポインタは、変数のアドレスを指す変数、です。
単独では、「変数として使用することはできません。」(という理解でいてください)
必ず、他の変数が実体としてある時に、セットで使用するものです。
配列は、変数を複数個、いっぺんに扱うための仕組みです。
場所はどちらも、メモリ上です。
・単にしまい方、呼び出し方が違うだけなのでしょうか?
いろいろ違います。
・ポインタと使えるところでは配列も使えるのでしょうか?
使えません。
・そもそもしまわれる場所って何処なのでしょうか?
しまわれる場所って何ですか?
一応、表面的な使い方だけ。
普通の変数 int v;
配列 int a[10];
ポインタ int *p;
p = &v; // ポインタにv をセットする
a = &v; // 配列にvはセットできない
p = &a[0]; // ポインタに配列の先頭番地を割り当てる
p = a; // これも可能。ポインタに配列の番地を割り当てる
a[2] = 10; // 配列として扱う
p[2] = 10; // ポインタでも、配列のようにアクセスは可能だが・・・
p = &v;
p[2] = 10; // これもできてしまうため、注意が必要
p = a;
p++; // こうすると、pはa[1]の番地がセットされる
a++; // これはできない
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
fopne で失敗する原因
-
リトルエンディアンというもの...
-
NULLとブランクの違い
-
LPSTR型の初期化について
-
CWnd::EnableWindow()の扱い方
-
Run-Time Check Failure #3とい...
-
ポインタについて
-
デバイスハンドルとは?
-
ハンドルはポインタか
-
基本アルゴリズムの『返す』の...
-
C++ vectorのbeginについて
-
C++ Builderでのnewコマンドに...
-
別のDLLのダイアログを・・・
-
トリプルポインタが必須!とな...
-
C#,C++/CLI,MFCにおけるデータ...
-
sizeofについて
-
ポインタ変数を変数に渡す方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
参照型で受け取った引数をポイ...
-
トリプルポインタが必須!とな...
-
ハンドルはポインタか
-
LPSTR型の初期化について
-
ポインターの使用法や利点
-
ポインタについて
-
c言語で任意のファイルから読み...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
ハンドル、アドレス、ポインタ...
-
アプリを32bitから64bit移行
-
デバイスハンドルとは?
-
NULLとブランクの違い
おすすめ情報