C言語関係掲示板

過去ログ

No.86.混乱しかけて・・・(ポインタ)


はじめまして、C言語の「恐山」とも聞かされていた「ポインタ」のところで
ちょっと おや? などと思えるところで止まってしまいました。
良きアドバイスをどうかよろしくお願いします。
次の意味が・・・(Poは、ポインタ変数です)
@.*Po+1
A.*(Po+1)
B.*Po+=1
C.*Po++


ども。


おそらく演算子の優先度順序の問題が含まれているため混乱しかけているのでは
ないかと思います。詳しくは適当な資料や(ここの)HPを調べてみてください。

今回、演算子の優先順序に関しておさえておかなければならない点は、
・単項演算子は2項演算子よりも優先度が高い
・単項演算子の結合法則は右から左である
の2点です。これをふまえて考えてみてください。

>@.*Po+1
>A.*(Po+1)
>B.*Po+=1
>C.*Po++

3,4は代入文が含まれるため毛色が異なりますね。1,2で演算子*の作用と優先度
を理解してから3,4にとりくむとよいかと。

ポインタを理解する手順はだいたい以下の通りでやるといいかも。
1.1 *と&の使い方
1.2 ポインタ変数の加減算
2.1 1次元配列との関係
2.2 文字列との関係
4. その他(以下略)
必ずひとつ前の段階を理解してから次へ進んでください。そうしないとあとで
ハマリます。

1.1に関しては{p=&x;y=*p;}が{y=x;}と同じ結果になることが理解できればOK
1.2に関しては*(p+1)と(*p)+1の違いが理解できればOK
...以下割愛(ちょっと簡単には書ききれないので)
# x,yは普通の変数。pはポインタ変数

演算子の優先順位が理解(というか暗記)できていないと、複合的な理由で
混乱しかけることが多いです(ポインダがらみはとくに)。


では。


こんばんは。

>次の意味が・・・(Poは、ポインタ変数です)
>@.*Po+1
>A.*(Po+1)
>B.*Po+=1
>C.*Po++

とりあえず、次のプログラムを実行して動作確認をしてみてください。
不明点などありましたら、また書き込んでみてください。


#include <stdio.h>
int main(void)
{
        int data[] = {10,20,30},a;
        int *po = data;
        
        printf("*po = %d\n",*po);               /* po の指すデータ */
        printf("*po+1 = %d\n",*po+1);   /* po の指すデータ+1 */
        printf("*(po+1) = %d\n",*(po+1));       /* po+1 の指すデータ */
        
        *po+=1;                         /* po の指すデータを実際に+1 */
        printf("*po+=1 = %d\n",*po);
        
        a = *po++;                      /* po の指すデータをaに代入してからpoを++ */
        printf("a = %d\n",a);   
        printf("*po = %d\n",*po);
        
        return(0);
}


ご親切なアドバイスを、本当にありがとうございます。
このような乏しい知識ですが、アドバイスをみて
理解させて頂くことができました。
本当にありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.01.11
Copyright(c) 2000-2002 TOMOJI All Rights Reserved