
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 配列とポインタについて 2 2022/06/02 11:53
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- 電気・ガス・水道業 複数の積算消費電力計での配線方法 1 2022/04/04 11:04
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- 投資・株式の税金 株配当金の節税について教えてください 2 2022/06/15 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
戻り値で構造体を返すことは可...
-
Run-Time Check Failure #3とい...
-
PASCALとFARの意味
-
セグメントエラー
-
init関数の意味
-
CWnd::EnableWindow()の扱い方
-
C言語、配列とポインタとアスタ...
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
構造体を値で渡す良い点はあり...
-
C言語のポインタに直接アドレス...
-
#define NULL ((void *)0) の弊害
-
1mWの緑レーザポインタで紙は、...
-
プログラミングのfarについて
-
クラスの参照渡しとメンバ変数...
-
Segment情報の取得と設定
-
構造体の削除について
-
FT_Memoryというオブジェクトは...
-
関数内、ファイルのstatic変数
-
どうしてエラーになるかわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
参照型で受け取った引数をポイ...
-
init関数の意味
-
セグメントエラー
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
C言語でのconstを返す関数
-
C++で関数ポインタから関数名を...
-
パスからファイル名を抽出
-
ReadFileの読み込みエラーについて
-
#define NULL ((void *)0) の弊害
-
CImage GetBitsメソッドについて
-
ポインタ変数の疑問
-
Cで作成したDLL関数をVBから呼...
おすすめ情報