#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をわざわざつける意味がわかりません
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
> cur→オブジェクト→オブジェクトhead
違います。
最初は cur = &head; により cur は head (オブジェクト)へのポインターを示しています。
つまり、head のアドレスと cur へ代入された値は同じものです。
よって、この時点では cur->next と head.next は同じものをさしていることを意味します。
実行途中で cur = new によって別のオブジェクトへのポインターへ置き換わります。
見難いかもしれませんが、概念図を添付します。
No.3
- 回答日時:
以下の様なイメージです。
curは常に一番右(最も最近に領域確保した)のNode型を指しています。
最初
head → NULL
↑
cur
2回目
head → オブジェクト → NULL
↑
cur
3回目
head → オブジェクト → オブジェクト → NULL
↑
cur
No.2
- 回答日時:
> 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 で読み出したもの以外は破棄されます。
No.1
- 回答日時:
(1) 「cur の指すオブジェクト」なら *cur じゃないとおかしいねぇ. つまり「20行目のcur = &head;はcurの指すオブジェクトにheadのアドレスを代入という事だと思うのですが」から間違っている. そしてそのあとの「curの指すオブジェクトの*nextにheadのを指すポインタを代入する」はどこから出てきたのかさっぱりわからない.
(2) では逆に %*c がなかったらどうなるかを考えてみよう. scanf の変換指示 %c の理解度チェックに使える... かな?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Visual Basic(VBA) FileSearch2007に変わる構文について 1 2022/12/16 16:57
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- JavaScript 画像の表示位置 3 2022/12/23 08:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
実行時エラー 3265「要求された...
-
VBAからPDFファイルにパスワー...
-
エクセルマクロエラー「'Cells'...
-
VBAで Set wb = Sheets(1).Cop...
-
VBAで既に開いている別アプリケ...
-
VBAで作成するメール(開封確認...
-
VBで引数にDictionaryオブジェ...
-
ローカル変数を戻り値に使うと...
-
PowerPointVBAでスライドマスタ...
-
[C#]static void 関数内でthis
-
ある文字列が全て数字であるか...
-
【VB】【エクセル操作】 SaveAs...
-
UserForm1.Showでエラーになり...
-
Excelでフィルタをかけると警告...
-
Excel VBA Collection.add で R...
-
C#でオブジェクトの配列を使う
-
AccessVBAで「dim dbs as datab...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
実行時エラー 3265「要求された...
-
VBAで既に開いている別アプリケ...
-
PowerPointVBAでスライドマスタ...
-
VBAで Set wb = Sheets(1).Cop...
-
エクセルマクロエラー「'Cells'...
-
ある文字列が全て数字であるか...
-
VBAについてです。 初心者です...
-
VBScriptでファイルの日時順(降...
-
Excelでフィルタをかけると警告...
-
VBAからPDFファイルにパスワー...
-
VBで引数にDictionaryオブジェ...
-
このように書くべきですか? { ...
-
EXCEL VBA オートシェイプナン...
-
テキストボックス中の文字列の...
-
エクセルVBAでcode128のバー...
-
[VBA]CDOメッセージ送信エラー
-
オブジェクトが見つかりません
おすすめ情報
cur = &head curにheadのアドレスを代入
cur->next = new; curにheadのアドレスを代入ということはcurがheadを指している
そしてheadのnextにcurを代入という事でしょうか?
それともcurの指すオブジェクトのnextがheadを指していてheadのnextにポインタnewを代入するということでしょうか?
何度もすみません
NODE *cur で二つのメンバを持ったオブジェクトをポインタcurが指しているといった理解の仕方で良いのでしょうか
cur→オブジェクト→オブジェクトhead