プロが教える店舗&オフィスのセキュリティ対策術

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
char moji;
struct node *next;
} NODE;

NODE head;

int
main ()
{
char n;
NODE *cur;
NODE *pcur;
NODE *new;

head.next = NULL;
cur = &head;<<<<<<<<<<<<<<<<<<<<<<<,

do
{
scanf ("%c%*c", &n);<<<<<<<<<<<<<<<<<<<<<

if (n == '-')
continue;

new = (NODE *) malloc (sizeof (NODE));

if (new == NULL)
{
printf ("malloc error\n");
return 0;
}

cur->next = new;
new->moji = n;
new->next = NULL;
cur = new;
printf("n='%c'\n",n);
}


質問(1)
20行目のcur = &head;はcurの指すオブジェクトにheadのアドレスを代入という事だと思うのですが、curの指すオブジェクトの*nextにheadのを指すポインタを代入する。ということはcurの指すオブジェクトのnextからheadへの矢印をつなげるといったイメージでよいのでしょうか?

質問(2)
%c%*cとありますが%*cをわざわざつける意味がわかりません

よろしくお願いします。

質問者からの補足コメント

  • うーん・・・

    cur = &head curにheadのアドレスを代入

    cur->next = new; curにheadのアドレスを代入ということはcurがheadを指している
    そしてheadのnextにcurを代入という事でしょうか?
    それともcurの指すオブジェクトのnextがheadを指していてheadのnextにポインタnewを代入するということでしょうか?

      補足日時:2015/10/27 00:54
  • 何度もすみません
    NODE *cur で二つのメンバを持ったオブジェクトをポインタcurが指しているといった理解の仕方で良いのでしょうか
    cur→オブジェクト→オブジェクトhead

      補足日時:2015/10/27 17:31

A 回答 (4件)

> cur→オブジェクト→オブジェクトhead


違います。
最初は cur = &head; により cur は head (オブジェクト)へのポインターを示しています。
つまり、head のアドレスと cur へ代入された値は同じものです。
よって、この時点では cur->next と head.next は同じものをさしていることを意味します。
実行途中で cur = new によって別のオブジェクトへのポインターへ置き換わります。
見難いかもしれませんが、概念図を添付します。
「c言語 アルゴリズム ポインタ」の回答画像4
    • good
    • 0

以下の様なイメージです。


curは常に一番右(最も最近に領域確保した)のNode型を指しています。

最初
head → NULL

cur


2回目
head → オブジェクト → NULL
    ↑
    cur

3回目
head → オブジェクト → オブジェクト → NULL
            ↑
            cur
    • good
    • 0

> cur = &head curにheadのアドレスを代入


その通りです。

> cur->next = new; curにheadのアドレスを代入ということはcurがheadを指している
> そしてheadのnextにcurを代入という事でしょうか?
最初(一回目)に限って言えばその通りですが、curは cur = new によって更新されるので cur が headのアドレスを示しているのは最初の一回目だけです。

オブジェクト(変数の値が格納されている領域 = ポインタ以外の変数のことを言います)とポインタ(変数の値が格納されている領域へのアドレスを示す)の意味をよく理解しましょう。

%c%*c の %*c を付けないと、複数文字入力した場合に奇妙な現象に見舞われます。
%c は入力された文字の内一文字のみ取得しますが、複数文字一度に入力した場合には残りは入力バッファに残ったままになります。この状態で再度 scanf を呼び出した場合はバッファに残ったものから読み出されるので、入力状態(入力待ち)にならず、直ぐに scanf 関数から戻ってきます。これを避けるために %*c が必要です。これを記述することによって、%c で読み出したもの以外は破棄されます。
    • good
    • 0

(1) 「cur の指すオブジェクト」なら *cur じゃないとおかしいねぇ. つまり「20行目のcur = &head;はcurの指すオブジェクトにheadのアドレスを代入という事だと思うのですが」から間違っている. そしてそのあとの「curの指すオブジェクトの*nextにheadのを指すポインタを代入する」はどこから出てきたのかさっぱりわからない.



(2) では逆に %*c がなかったらどうなるかを考えてみよう. scanf の変換指示 %c の理解度チェックに使える... かな?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!