![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
No.1ベストアンサー
- 回答日時:
char str[10];
であるならば、
// str 単独で使うと "char[10] の先頭アドレス" の意味になります。
str+0; // 先頭アドレス + char[0]分の幅
str+1; // 先頭アドレス + char[1]分の幅
str+2; // 先頭アドレス + char[2]分の幅
// アドレスから値を求める演算子 *
*(str+0); // (先頭アドレス + char[0]分の幅)にある char 値
*(str+1); // (先頭アドレス + char[1]分の幅)にある char 値
*(str+2); // (先頭アドレス + char[2]分の幅)にある char 値
// 先頭アドレスから索引の位置にある値を求める演算子 []
str[0]; // (先頭アドレス + char[0]分の幅)にある char 値
str[1]; // (先頭アドレス + char[1]分の幅)にある char 値
str[2]; // (先頭アドレス + char[2]分の幅)にある char 値
// 値からアドレスを求める演算子 &
&(str[0]); // ((先頭アドレス + char[0]分の幅)にある char 値)のアドレス
&(str[1]); // ((先頭アドレス + char[1]分の幅)にある char 値)のアドレス
&(str[2]); // ((先頭アドレス + char[2]分の幅)にある char 値)のアドレス
演算子 & は値からアドレスを求めるので、
アドレスである str に使用するとプログラムが壊れます。
ありがとうございます。
str[i] と*(str + i) および &str[i] と str + iと&*(str + i) は同じですか?
仮にiを+1していくとして、
iが+1されるとstr[i]のポインタのアドレス自体ではなく、
アドレスに入っているメモリの値が+1され、
iが+1されるとつぎのアドレスに移行すると聞いたのですが、それは上の5つのうちどれですか?
また、が+1されるとstr[i]のポインタのアドレス自体ではなく、
アドレスに入っているメモリの値が+1され、のは5つのうちどれですか?
No.3
- 回答日時:
その場合 &str+i は「ポインタのポインタ」にはならないです>#2.
配列とポインタとの関係をきちんと理解していない人がときどきいたりしますが, 例えば
int array[5];
と宣言されていた場合
array
は「そのままでポインタとなる」わけではなく,
int [5]
という型を持つ「配列オブジェクト」を表すのです. ところが
配列オブジェクトは特定の状況を除いて「その配列の先頭要素のアドレス」に変換される
という規則があるため, 結果として「先頭要素のアドレス」とみなされることが多いにすぎません.
ちなみに規格では
A[B] は *((A)+(B)) と同じ
&*p は (*p が型として合法なら) p と同じ
となっている.
No.2
- 回答日時:
ご質問者様が配列とポインタで『混乱されている』のは理解できます。
但しご質問の文面は『...ですか。』が多すぎて、一体『何処で混乱しているのか』判断ができません。以下の説明がご質問者様のポイントとズレているならば無視して下さい。char
str [] = "abcde";
1.上は文字列"abcde"を表す配列を宣言したところです。これ以後のソースコードに...
str [ 2 ]
と書けば、配列は"0"から始まりますから「配列strの3番目のデータ(つまり0,1,2と数えて)」を表します。上の宣言を見ればstr [ 2 ]はデータ'c'を表していることをご理解いただけるでしょう。つまりstr[i]と書くことは、ポインタではなくデータを表すことにご注意下さい。
2.上の宣言は以後のソースコードの中で...
str
と書けば今度はポインタを表すこともご存知のはずです。それならば...
str + i
と書き表してもポインタを表すことは理解できますか? これは『ポインタ"str"を"i"だけインクリメントしたポインタ』です。ポインタは...
*(str + 2)
などと書いた時に初めて「データ」を示すことができます。このデータは先程の配列str [ 2 ]と同じ'c'を表していることを理解できますか?
ポインタの名前の先頭に"*"を付けるとデータを表すことにご注意下さい。
3.1の例に書いたように配列をstr [ 2 ]と書き表すと、それはデータ'c'を表すことに注目して下さい。そして...
&str [ 2 ]
と書くと、今度はポインタを表すことにお気づき下さい。つまり、データを表す名前の先頭に"&"を付けるとポインタになるのです。ご質問者様は「&str[i] はアドレスの指す配列を表す...」などと大変難しい表し方をしていますが、&str [ 2 ]は単にデータ'c'が格納された場所を表すポインタ(アドレス)でしかありません。
4.ある変数がデータを示すのか、あるいはポインタなのかきちんと判別することが重要です。
その上でデータならば先頭に"&"を付ければポインタになり、ポインタの先頭に"*"を付ければデータになることをきちんと把握することです。
5.ここまでをご理解いただければ、ご質問者様お書きの...
(&str + i)
はポインタでもデータでもなく、なんと『ポインタのポインタ』になることをご理解いただけるはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) VBA ユーザーフォームからSubプロージャ―に値を引き渡す方法 3 2023/04/09 01:54
- Visual Basic(VBA) ブックのCOPY 4 2023/02/25 20:17
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
C言語のポインタに直接アドレス...
-
構造体とfscanf
-
C言語の関数と配列に関する質問
-
DLL<->VB間での受け渡し(文字...
-
fopne で失敗する原因
-
デバイスハンドルとは?
-
[excel vba] マウスポインタの...
-
この(C言語)ダブルポインタ...
-
gccでMAKEINTRESOURCEするとdif...
-
Linked List(線形リスト)を使...
-
nullポインタを逆参照とは?
-
ダイアログから、ドキュメント...
-
Wordでのリンク方法(Ctrlキー...
-
C言語ソースコードの解析
-
マイクロソフトマウスで「Wirel...
-
C言語でのconstを返す関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
C言語の関数と配列に関する質問
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
構造体とfscanf
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
main(int argc,char **argv[])...
-
DLL<->VB間での受け渡し(文字...
-
エラーの意味
-
PASCALとFARの意味
-
ハンドルはポインタか
-
CWnd::EnableWindow()の扱い方
おすすめ情報
str[i] と*(str + i) および &str[i] と str + iと&*(str + i) は同じですか?
仮にiを+1していくとして、
iが+1されるとstr[i]のポインタのアドレス自体ではなく、
アドレスに入っているメモリの値が+1され、
iが+1されるとつぎのアドレスに移行すると聞いたのですが、それは上の5つのうちどれですか?
また、が+1されるとstr[i]のポインタのアドレス自体ではなく、
アドレスに入っているメモリの値が+1され、のは5つのうちどれですか?