C言語関係掲示板

過去ログ

No.4. ポインタのポインタについて


はじめまして、こんにちは。
突然ですが、私はポインタのポインタというのもがうまく理解できていません。

今までは感覚的に単なるポインタ配列かな?程度で何とかなったんですが、仕事でC言語を使うことになり、もっと厳密に理解しようと思っています。
そこでひとつ問題が発生しました。
このプログラムは線形リストからノードを上から順に削除するものなんですが、うまくいきません。

/***********************************************************/*■ノードを削除
/***********************************************************例1 成功)
void ClearNode(NODE **start)
{
NODE *ptr;

while(*start != NULL){
ptr = (*start)->next; //1つ先のデータを保存
free(*start);
*start = ptr;
}
}

例2 失敗)
void ClearNode(NODE *start)
{
NODE *ptr;

while(start != NULL){
ptr = start->next; //1つ先のデータを保存
free(start);
start = ptr;
}
}

この場合、ポインタを渡しでもポインタのポインタでも
原理的に同じような気がするのですが、例1ではうまく開放でき、
例2ではプログラム自体はちゃんと実行されるのですが、
開放した領域に再び書き込んで全体表示すると、領域がちゃんと開放されていないのか、うまく表示できません。

昨日一日悩んだんですが、答えが出ませんでした(^-^;)

どうかよろしくお願いします


図を書いてみるといいですよ。

こんにちは、ともじです。
上記の例、どちらもメモリは解放されると思います。
ただ、ポインタにした場合には、リストの先頭を保存しているエリア
がNULLになりません。

図を書いてみたので、参照してください。
http://www9.plala.or.jp/sgwr-t/c/images/zu010506.gif


なるほど!でもちょっとわからないことがあるんですが、
ポインタを渡した場合startには渡した側のアドレスが入るのではなく
aaaのが指すアドレスの中身が入るのでしょうか?

NODE *aaa;

void main()
{
(中略)
ClearNode(aaa);
}

void ClearNode(NODE *start)
{
     NODE *ptr;

while(start != NULL){
ptr = start->next; //1つ先のデータを保存
free(start);
start = ptr;
}
}

としたときにstartにはaaaのアドレスがセットされるのではなく
startにはaaaの中身、たとえばaaaが15という内容だったとき
startには15が入るいうことなのでしょうか?


ポインタも変数です。

ポインタはアドレス変数、つまり変数には変わりありません。
int aaa=15; のとき、aaaは15ですよね。
int *aaa=15;(これWarningが出ますけど) でしたら、aaaはやはり15です。

戻る


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