• ベストアンサー

ポインタに関する質問

int v; int *p=&v ポインタ変数pに変数vのアドレスを代入して、次からは、pからvの値を操作したいのですが、「*p++」としたところ、変数vの値がインクリメントされずに、pに格納されるアドレスその物がインクリメントされてしまいました 「*p+=1」とする事でvの値をインクリメントすることができましたが、 「*p+=1」このように書かれる処理は望ましい物ではないのでしょうか

  • tukai
  • お礼率57% (102/177)

質問者が選んだベストアンサー

  • ベストアンサー
  • peko_pee
  • ベストアンサー率53% (45/84)
回答No.4

目的がはっきりしていれば決して「望ましくない書き方」ではないですよ。 演算子の優先順位に気をつけていればご質問にあるような混乱も避けられると思います。 「*p++」では「*」よりも「++」のほうが優先順位が高いため、結果として「*(p++)」という 計算になります。 「*p+=1」は「+=」よりも「*」(間接参照)のほうが優先順位が高いため「(*p)+=1」となり 「(*p)++」と同等で、結果として v をインクリメントできます。 演算子の優先順位は僕自身もすべて憶えているわけではないのでの表を見なければ 自信がもてないことも多いですが、不安なときには自分の意図する計算順位になるように 上記のようにカッコを付けて順位を明示するのもひとつの手です。 ↓C言語演算子の優先順位についてはこのサイトがわかりやすいと思います。 http://www.bohyoh.com/CandCPP/C/operator.html

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス >「*p+=1」とする事でvの値をインクリメントすることができましたが、 >「*p+=1」このように書かれる処理は望ましい物ではないのでしょうか  ↑  『(*p)++;』とすれば v をインクリメントできますけど。  演算子の優先順序や結合法則によってカッコをつけるか、  『*p += 1;』とするしかないです。 >ポインタ変数pに変数vのアドレスを代入して、次からは、pからvの値を操作したいのですが、 >「*p++」としたところ、変数vの値がインクリメントされずに、 >pに格納されるアドレスその物がインクリメントされてしまいました  ↑  これは正しい動作ですよ。  この質問はポインタの何を知りたいのですか? ・以上。

  • mizz
  • ベストアンサー率23% (6/26)
回答No.2

(*p)++; としたら変数vがインクリメントされると思いますが・・・ ちがってたらごめんなさい。

noname#69788
noname#69788
回答No.1

*(p++)と解釈されたのでしょう。ポインタはバグのもとなのでJAVAを使った方がいいと思います。

関連するQ&A

  • 参照型変数へのポインタに関してです。

    参照型変数へのポインタに関してです。 たとえば int _v[10]; int &v = &_v[0]; int *pv; pv = &v;  // 参照型変数のアドレスをポインタに代入 こうすると、pv[n]と、_v[n]は同値になります。(VC++とG++では確認) これ(この使い方)で同値なのは ・c++の言語仕様 ・コンパイラの実装依存 のどちらでしょうか? WEBを漁ると「参照型変数はエイリアス(別名)」とかかれているページがヒットするので、C++の言語仕様かなと思っています。 #もちろん配列に置き換えずに単純な参照型変数として使った場合の、値の同一性は言語仕様でしょうが。

  • ポインタ

    ポインタの勉強をはじめたばかりの者なのですが、たとえば int *p などでポインタを宣言する場合には、メモリ上で変数pにはアドレスを格納するだけの領域が与えられます、このとき何バイトの領域が与えられるのでしょうか?

  • 変数

    ポインタ変数なんですが、 int *p;と宣言した時 自分自身のアドレスを持ってますか?(プログラムが終わるまで?) ポインタ変数は、他の変数アドレスを格納しますよね。 また数値の値も格納しますよね。 これは、ポインタ変数宣言 時の自分のアドレスに、 他の変数のアドレス、数値の値、 と二つを格納しているのですか? ポインタ自身のアドレス出力は(int *pの時) printf("%p",&p); 他の変数のアドレス出力は(p=&の時) printf("%p",p); であってますか? 普通の変数は、自身のアドレス、数値の値、だけ、 ポインタ変数はさらに、他の変数の値を格納していますか? 教えてください。

  • ポインタいついて教えてください

    ポインタがわかりません。 教えてください。 下の二つは、共に「100」を表記すると思いますが、 どこがどのように違うのですか。 また、f1()という関数をつくって、ここで scanfを使って、5つぐらい値を代入させて、 他の関数でこの値を使おうと思っています。 この場合下のどちらを使うのが、よろしいのでしょうか。 よろしくお願いします #include <stdio.h> int main(void) { int *p, q; q = 100; /* q に100を代入 */ p = &q; /* p にq のアドレスを割り当てる */ printf("%d", *p); return 0; } #include <stdio.h> int main(void) { int *p, q; p = &q; /* q のアドレスを得る */ *p = 100; /* ポインタを使ってq に値を代入する */ printf("%d", q); return 0; }

  • ポインタ変数を変数に渡す方法

    (int * 型)ポインタ変数に代入されたアドレスを、(普通の)int 型変数に代入したいのですが、どのようにするのが正しいのでしょうか。 想定しているケースは、与えられたメモリ番地に対して、アドレスオフセットを加えるなどの操作を施して「補正アドレス」を生成し、メモリアクセスを行う、というような特殊な操作を実現するような場合です。 ※ メモリ番地がポインタ宣言で与えられる、という制約があります。 以下サンプルプログラムを書きました。組み込み系のプログラムを記述していますが、これで正しいでしょうか。 unsigned int *p, *p1; // ポインタ変数宣言 unsigned int value; p= (unsigned int *)0x00001F00; // メモリの0x1F00番地 value = p; // <-- ここが心配 value |= 0xCC << 16; // 与えられたアドレスから value &= 0x4 << 12; // 「補正アドレス」生成 p1 = (unsigned int *)value; *p1 = 0xA5A5_A5A5; // 「補正アドレス」にA5A5... をライト C言語初心者で、いろいろなサイトを見てみたのですが、説明されているページが見つからず質問させていただきました。どうぞよろしくお願いします。

  • ポインタへの値の代入時の警告の原因

    私は現在、事務職をやっており、プログラミングとは全く別の畑に居ます。 真剣に転職を考えておりC言語を独学にて勉強中なのですが、ポインタの勉強中、どうしても理解できない点がありましたので質問いたしました。 ポインタを理解するために下記1~3のような処理をさせました。 1.文字変数s に 'a' を代入 2.ポインタp を宣言し、変数s のアドレスを代入 3.最終的にpの値を確認する。 #include<stdio.h> int main (void) { char  s; char  *p; s = ' a '; p = & s;        //←ここが9行目です printf (" pは %c です\n " , *p); return 0; } すると、 『 pは a です 』 と、期待通りの表示がされました。 次に、9行目を *p = s と書き換えた所、コンパイル時に 『値が割り当てられていないローカルな変数’p’に対して参照が行われました』 と言う警告が表示されました。 実行してみた所、 『pは a です』 と、結果は期待通りのものが表示されたのですが、この警告がなぜ表示されたのかが分かりません。 参考書を読んでも、このような(*p = sのような)書き方は載ってましたし、私自身、『「ポインタ変数pの値*p」に「変数sの値」を代入した。』と認識している為、間違いでは無いと考えております。 この警告がなされた原因について、どなたかご存知でしたら、宜しくお願いいたします。

  • 構造体を指すポインタからその中のポインタ変数が指す要素の参照

    構造体を指しているポインタから、 その構造体内にあるポインタ変数の指している要素に値を代入する方法が、どうしてもわかりませんでした。 どなたか助けてください、お願いします。 struct Kouzou { int* p; }; int main() { Kouzou kou; Kouzou* k_p; k_p = &kou; k_p -> *p = 10; //エラー }

  • ポインタの宣言

    ポインタを宣言するとメモリ上に、ポインタ変数を格納するための領域が確保されます。ポインタ=アドレスというのは大丈夫なのですが、 int *b のようにどうして、ポインタに型があるのでしょうか?単に変数のアドレスを表示するだけならば型はいらないと思うのですが。 またこのとき宣言された変数は *b ではなくて b であってますよね?

  • ポインタについて

    配列のポインタについて教えてください。 int array[2][2]={1,2,3,4}; int *p; のような場合、 p=array;  にするとエラーがでますが、なぜですか? (p=(int *)array;のようにキャストすれば平気) _1_2_3_4_という風にメモリー上に並んでいますよね? 配列の場合array(&array[0][0])はこのメモリーの1が格納されているアドレスを指すわけですが、これをポインタpに入れるとなにか問題でも起こるんですか?

  • ポインタの初歩でお聞きしたいです。

    今カレンダーを作っていて、西暦と月を入力するとその時のカレンダーを表示するだけです。 関数で、「関数は戻り値を1ッコしか返せないので、複数個返すことができるようにするには」みたいなところを勉強中です。 int main() { int year,month,week,days;       : getYearMonth(&year,&month);       : return 0; } getYearMonth(int *py,int *pm) { printf("西暦と月を2009 3のようにスペースで区切って入力してください\n"); while(1) { scanf("%d %d",py,pm); //*ここがちょっとわからないところです* if((*pm>=1)&&(*pm<=12)){ //1から12月まででそれ以外の数字なら break; // printf("入力間違いです\n") } return; } "*pyや*pm"がscanfのところにいくと'*'とって'&'をつけないのは"pyとpm"がアドレスを指すってモノっていうことですか? getYearMonth(&year,&month);ではyearとmonthには'&'アドレスのマークをつけますけれど、それは下とおなじですよね? -------------------------------------------------------------- int x; //変数の宣言 int *p; //ポインタ変数の宣言 p=&x; //ポインタ変数の初期化 ここが、getYearMont(&year,&month);と一緒? *p=10; //値(アドレス)の代入 scanf()で値を入れてるところと同じ? ということでしょうか? ちょっと、ポイントで引っかかってます。 ポインタってデスクトップのショートカットアイコンみたいなものです よって、前になんかで見たんですが。イメージがつかみづらいです。 もしかしたら、質問自体ちぐはぐな事を言ってたらすみません。

専門家に質問してみよう