C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: ポインタの使用法に関する質問


(過去ログ 69 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■40289 / inTopicNo.1)  ポインタの使用法に関する質問
  
□投稿者/ Tungus (1回)-(2009/08/23(Sun) 12:47:44)

分類:[C/C++] 

初めまして
ポインタの使用法にどうにも慣れず、使用法を勉強し直しています
そこで、勉強したことを表にしてまとめようとしているのですが、間違えて覚えている部分がないかどうか添削していただけないでしょうか?
この手のまとめというのが書いてある本がなぜかほとんどなくて・・・

ちなみに表での「値」はポインタ変数が記述されているメモリアドレスに入れる値のことです(例:int *pint = 6とか書いた場合、6のことです)
概念的にポインタは「箱」というものらしいので「箱」の置き場所を「アドレス」、「箱」の中身を「値」というイメージがわいた結果によります。
物理的な話をすれば、
「メモリ上でポインタが使われている場所」が「アドレス(メモリアドレス?)」
「アドレスのどのビットが立ってどのビットが立っていないか」が「値」
ということなのでしょうが・・・わかりにくいです。

1.ポインタ変数の定義
書き方:型名 *ポインタ変数名
使用例:int *pint;

2.ポインタ変数へ値を代入

書き方:*ポインタ変数名 = 値
使用例:*pint = 6;

3.ポインタ変数へ普通の変数の値を代入(実際は右辺のアドレスの内容を左辺のアドレスへコピー)
書き方:ポインタ変数名 =  &変数名
使用例:pint = &valint;

4.ポインタ変数へアドレスを代入
書き方1:ポインタ変数名 = アドレスの値
使用例1:pint = 0x1119;
書き方2:ポインタ変数名 = ポインタ変数名
使用例2:pint = pint2;

5.ポインタ変数の値を取得する(=ポインタが示す値の内容を取得)
書き方:*ポインタ変数名
使用例:int valint = *pint;

6.2つのポインタ変数の間で、値を渡す
書き方:*ポインタ変数名=*ポインタ変数名
使用例:*pint = *pint2;

7:配列の先頭アドレスをポインタ変数へ代入
書き方1:ポインタ変数名=配列変数名
使用例1:int inTbl[10];
pint = inTbl;
書き方2:ポインタ変数名=&配列変数名[0]
使用例2:pint = &inTbl[0];

8:ポインタ変数の特定のアドレスの値のみ書き換える
書き方:ポインタ変数名[書き換えたい要素]=変更後の値
使用例:pint[4] = 0;(int *pintの32*4ビット目が0に)

9:ポインタ変数の特定のアドレスの値を取得
書き方:ポインタ変数名[知りたい要素]
使用例:valint = pint[4];


10:構造体変数の値を、ポインタ変数へ代入
書き方:ポインタ変数名=&構造体変数名
使用例
 struct StFoo *LpStFoo;
 struct StFoo StFoo;
 LpStFoo = &StFoo;

11:ポインタが指し示す、構造体変数のメンバを取得(int型のメンバがあると思ってください)
書き方1:ポインタ変数名->メンバ名
使用例1:int valint = LpStFoo->mem1;
書き方2:ポインタ変数名.メンバ名
使用例2:int valint=*LpStFoo.mem1;

これ以外にも「この書き方は知っておいた方がいい」というものがありましたら教えていただければ幸いです
引用返信 編集キー/
■40295 / inTopicNo.2)  Re[1]: ポインタの使用法に関する質問
□投稿者/ Jitta on the way (405回)-(2009/08/23(Sun) 13:50:58)
No40289 (Tungus さん) に返信
> 初めまして
> ポインタの使用法にどうにも慣れず、使用法を勉強し直しています
> そこで、勉強したことを表にしてまとめようとしているのですが、間違えて覚えている部分がないかどうか添削していただけないでしょうか?
> この手のまとめというのが書いてある本がなぜかほとんどなくて・・・
>
> ちなみに表での「値」はポインタ変数が記述されているメモリアドレスに入れる値のことです(例:int *pint = 6とか書いた場合、6のことです)
> 概念的にポインタは「箱」というものらしいので「箱」の置き場所を「アドレス」、「箱」の中身を「値」というイメージがわいた結果によります。
> 物理的な話をすれば、
> 「メモリ上でポインタが使われている場所」が「アドレス(メモリアドレス?)」
> 「アドレスのどのビットが立ってどのビットが立っていないか」が「値」
> ということなのでしょうが・・・わかりにくいです。
>
> 1.ポインタ変数の定義
> 書き方:型名 *ポインタ変数名
> 使用例:int *pint;
>
> 2.ポインタ変数へ値を代入
>
> 書き方:*ポインタ変数名 = 値
> 使用例:*pint = 6;

間違い。
値をしまうところを用意するのではなく、値をしまう所を“示して”いるので、値をしまう場所を用意しなければなりません。
書き方としては間違っていませんが、使用方法としては間違っています。



>
> 3.ポインタ変数へ普通の変数の値を代入(実際は右辺のアドレスの内容を左辺のアドレスへコピー)

ん?右辺のアドレスをさすようにする、かな?


> 書き方:ポインタ変数名 =  &変数名
> 使用例:pint = &valint;
>
> 4.ポインタ変数へアドレスを代入
> 書き方1:ポインタ変数名 = アドレスの値
> 使用例1:pint = 0x1119;

いや、これは、まずしない。


> 書き方2:ポインタ変数名 = ポインタ変数名
> 使用例2:pint = pint2;
>
> 5.ポインタ変数の値を取得する(=ポインタが示す値の内容を取得)
> 書き方:*ポインタ変数名
> 使用例:int valint = *pint;
>
> 6.2つのポインタ変数の間で、値を渡す
> 書き方:*ポインタ変数名=*ポインタ変数名
> 使用例:*pint = *pint2;
>
> 7:配列の先頭アドレスをポインタ変数へ代入
> 書き方1:ポインタ変数名=配列変数名
> 使用例1:int inTbl[10];
> pint = inTbl;
> 書き方2:ポインタ変数名=&配列変数名[0]
> 使用例2:pint = &inTbl[0];
>
> 8:ポインタ変数の特定のアドレスの値のみ書き換える
> 書き方:ポインタ変数名[書き換えたい要素]=変更後の値
> 使用例:pint[4] = 0;(int *pintの32*4ビット目が0に)

ん?
これ、配列を指しているときはよくても、そうでなけれは、ちと怖いですよ。


>
> 9:ポインタ変数の特定のアドレスの値を取得
> 書き方:ポインタ変数名[知りたい要素]
> 使用例:valint = pint[4];
>
>
> 10:構造体変数の値を、ポインタ変数へ代入

値を代入するわけではありません。


> 書き方:ポインタ変数名=&構造体変数名
> 使用例
>  struct StFoo *LpStFoo;
>  struct StFoo StFoo;
>  LpStFoo = &StFoo;
>
> 11:ポインタが指し示す、構造体変数のメンバを取得(int型のメンバがあると思ってください)
> 書き方1:ポインタ変数名->メンバ名
> 使用例1:int valint = LpStFoo->mem1;
> 書き方2:ポインタ変数名.メンバ名
> 使用例2:int valint=*LpStFoo.mem1;
>
> これ以外にも「この書き方は知っておいた方がいい」というものがありましたら教えていただければ幸いで口口
引用返信 編集キー/
■40301 / inTopicNo.3)  Re[2]: ポインタの使用法に関する質問
□投稿者/ Tungus (2回)-(2009/08/23(Sun) 19:00:12)
> 間違い。
> 値をしまうところを用意するのではなく、値をしまう所を“示して”いるので、値をしまう場所を用意しなければなりません。
> 書き方としては間違っていませんが、使用方法としては間違っています。
2のことですか、それとも最初の理解?
2のときはあらかじめ1をやっているという前提で

>

>>4.ポインタ変数へアドレスを代入
>>書き方1:ポインタ変数名 = アドレスの値
>>使用例1:pint = 0x1119;
>
> いや、これは、まずしない。
組み込みとかで稀にあるんですよ・・・特定のアドレスに書けとかなんとか

>>8:ポインタ変数の特定のアドレスの値のみ書き換える
>>書き方:ポインタ変数名[書き換えたい要素]=変更後の値
>>使用例:pint[4] = 0;(int *pintの32*4ビット目が0に)
>
> ん?
> これ、配列を指しているときはよくても、そうでなけれは、ちと怖いですよ。
>
まあ、ポインタの型のbit数が分かっているという前提で。u8int(8bit int)とかの制御とかで使うことが・・・
計算ミス怖いのは確かですけどね

>
>>10:構造体変数の値を、ポインタ変数へ代入
>
> 値を代入するわけではありません。
>
構造体変数のアドレスのに書かれた内容を代入と言った方がいいのでしょうか?

概念理解がまずいのでしょうか・・・?
電気関係の大学に入り直して勉強しないとダメとか・・・?
引用返信 編集キー/
■40307 / inTopicNo.4)  Re[1]: ポインタの使用法に関する質問
□投稿者/ GOD (6回)-(2009/08/23(Sun) 21:47:26)
No40289 (Tungus さん) に返信
> 8:ポインタ変数の特定のアドレスの値のみ書き換える
> 書き方:ポインタ変数名[書き換えたい要素]=変更後の値
> 使用例:pint[4] = 0;(int *pintの32*4ビット目が0に)
>
> 9:ポインタ変数の特定のアドレスの値を取得
> 書き方:ポインタ変数名[知りたい要素]
> 使用例:valint = pint[4];
>
これはやらないと思いますよ。
*(pint+4) = 0;
valint = *(pint+4);
の方がよいと思います。

> これ以外にも「この書き方は知っておいた方がいい」というものがありましたら教えていただければ幸いです
>
変数のアドレスをポインタ変数に代入。
int x;
pint = &x;

ポインタ変数のアドレスを変数に代入。
int x;
x = pint;

あとは関数ポインタとか
http://www5c.biglobe.ne.jp/~ecb/c/16_01.html
引用返信 編集キー/
■40315 / inTopicNo.5)  Re[3]: ポインタの使用法に関する質問
□投稿者/ .SHO (1022回)-(2009/08/23(Sun) 23:48:30)
> >>4.ポインタ変数へアドレスを代入
> >>書き方1:ポインタ変数名 = アドレスの値
> >>使用例1:pint = 0x1119;
>>
>>いや、これは、まずしない。
> 組み込みとかで稀にあるんですよ・・・特定のアドレスに書けとかなんとか
>
> >>8:ポインタ変数の特定のアドレスの値のみ書き換える
> >>書き方:ポインタ変数名[書き換えたい要素]=変更後の値
> >>使用例:pint[4] = 0;(int *pintの32*4ビット目が0に)
>>
>>ん?
>>これ、配列を指しているときはよくても、そうでなけれは、ちと怖いですよ。
>>
> まあ、ポインタの型のbit数が分かっているという前提で。u8int(8bit int)とかの制御とかで使うことが・・・
> 計算ミス怖いのは確かですけどね

十分理解できてるように思えるけど、質問の真意は何なんだろう?
引用返信 編集キー/
■40346 / inTopicNo.6)  Re[2]: ポインタの使用法に関する質問
□投稿者/ ふくちゃん (51回)-(2009/08/24(Mon) 12:31:12)
>>これ以外にも「この書き方は知っておいた方がいい」というものがありましたら教えていただければ幸いです

	int data[100000];
	int i;
	int *p = data;


	// 通常
	for(i = 0; i < 100000; ++i) {
		printf("%d", data[i]);
	}

	// 通常より早い
	for(i = 0; i < 100000; ++i) {
		printf("%d", *p);
		++p;
	}


	先頭からn番目のデータを毎回見に行くよりも
	ポインタを一つ進めて、進んだ値を見るほうが早い。

わかりにくければ説明しますので、お気軽にもう一度質問投げてね。

引用返信 編集キー/
■40362 / inTopicNo.7)  Re[3]: ポインタの使用法に関する質問
□投稿者/ とっちゃん (415回)-(2009/08/24(Mon) 14:16:40)
とっちゃん さんの Web サイト
No40346 (ふくちゃん さん) に返信
> 	// 通常より早い
> 	for(i = 0; i < 100000; ++i) {
> 		printf("%d", *p);
> 		++p;
> 	}
最適化なしを前提とするならまだ無駄がありますね。少なくとも i の存在はいらないでしょ?
そうすれば足し算も一つになるし。もっとも最適化がわずかでも適用されるなら真っ先に最適化されるので
そういう意味では配列アクセスのほうが有利です(評価ポイントが変わるけどねw)
#本題とは関係ないけどねー


で、ポインタとは...を一言で表すと、「実体を指すもの」です。
実体に当たるものは、任意のメモリ、特定の変数、関数、リテラルデータと呼ばれるものやポインタなどなどです。
どれを指す場合でも、ポインタと呼びます。
.NET Framework や Java では参照型として、若干形を変えて生き残っています(ポインタとはちょっと違う)。
C++にも、参照型はありますが、これと、Javaや.NETFrameworkのやつとはちょっと違います。

それと、間違って覚えている人がいますが
メモリアドレス=ポインタではありません。アドレスはアドレスであり、ポインタとは異なります。
あと、鬼門とされるのは配列とポインタの違いですかね。出てないみたいですが...




せっかくポインタ出てきたから宣伝w<おい!
今週末の横浜勉強会でほんのさわり程度ですがでてきますよ。
そのあとは、たぶんほかじゃ聞けない(しおいらもしゃべらんw)ディープなネタですがwww

お申し込みはこちら-> http://www.wankuma.com/seminar/20090829yokohama02/Default.aspx

残りほんの数名(本当に数名)なので、早い者勝ちです。会場の席数の都合で、満席即打ち止めになると思います。
#本題は一歩進んでCOMですけどねーwww

引用返信 編集キー/
■40385 / inTopicNo.8)  Re[1]: ポインタの使用法に関する質問
□投稿者/ とおりすがり (5回)-(2009/08/24(Mon) 20:20:21)
No40289 (Tungus さん) に返信
> 8:ポインタ変数の特定のアドレスの値のみ書き換える
> 書き方:ポインタ変数名[書き換えたい要素]=変更後の値
> 使用例:pint[4] = 0;(int *pintの32*4ビット目が0に)

別に知らなくてもよいことですが、

4[pint] = 0;

とも書けます(知っている人は極少ではないでしょうか)。
引用返信 編集キー/
■40396 / inTopicNo.9)  Re[3]: ポインタの使用法に関する質問
□投稿者/ Jitta on the way (409回)-(2009/08/24(Mon) 23:11:27)
No40301 (Tungus さん) に返信
>>間違い。
>>値をしまうところを用意するのではなく、値をしまう所を“示して”いるので、値をしまう場所を用意しなければなりません。
>>書き方としては間違っていませんが、使用方法としては間違っています。
> 2のことですか、それとも最初の理解?
> 2のときはあらかじめ1をやっているという前提で


1は、ポインタを宣言しています。私が言っているのは、値を格納する場所が必要だ、という意味です。
int v;//これが必要
int *p=&v;




> >>8:ポインタ変数の特定のアドレスの値のみ書き換える
> >>書き方:ポインタ変数名[書き換えたい要素]=変更後の値
> >>使用例:pint[4] = 0;(int *pintの32*4ビット目が0に)
>>
>>ん?
>>これ、配列を指しているときはよくても、そうでなけれは、ちと怖いですよ。
>>
> まあ、ポインタの型のbit数が分かっているという前提で。u8int(8bit int)とかの制御とかで使うことが・・・
> 計算ミス怖いのは確かですけどね

計算ミス?
「ポインタ変数名[書き換えたい要素]」と書いてあったので気にしなかったのですが、理解が間違っている可能性があります。

ある人々からは「そんな教え方するな」といわれますが、配列をポインタでアクセスすることが出来ます。

double d[100];
double *p=d;

とした場合、d[10] と *(p+10) は、同じ値を参照できます。しかし、

double d;
double *p=&d;

とした場合、*(p+30) で、d の31ビット目にアクセスできるわけではありません。賢いコンパイラならエラーを出します。そうでなければ、実行時に何かが起こります。


> >>10:構造体変数の値を、ポインタ変数へ代入
>>
>>値を代入するわけではありません。
>>
> 構造体変数のアドレスのに書かれた内容を代入と言った方がいいのでしょうか?

「値を代入」することはありません。
ポインタは、値を指すものです。値そのものになることはありません。
対象が32ビットのVCなら、ポインタ変数は常に2バイト、32ビットの幅があります。構造体は、もっと大きくなりますよね?ポインタは、値を指すだけです。実体がないので、必ず実体を用意しなければなりません。




> 電気関係の大学に入り直して勉強しないとダメとか・・・?

そこまでする必要も時間もないと思います。
引用返信 編集キー/
■40433 / inTopicNo.10)  Re[4]: ポインタの使用法に関する質問
□投稿者/ Jitta on the way (412回)-(2009/08/25(Tue) 22:18:45)
http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm

学習したことを確認するのに、とてもよい素材です。コメントから読んでみましょう。
連載が中断しているのがとても残念。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -