読者です 読者をやめる 読者になる 読者になる

やばい、俺ポインタわからないっすよ!!!

やばい、宿題きた。

ポインタってのはあれだよ。 「『難しい難しい』と云っている人が考えているほどには難しくない」 けど 「『簡単簡単』といっている人が考えているよりは簡単じゃない」 んだよ。
...
あ、ポインタと配列が違うということがはっきりわかる事例をこれとは別に一つ挙げること :-) >いそぴー

404 Not Found

ヤバイッ。
今日は9時に帰ろうと思ったけれど、
結局10時過ぎに……。14時間労働後の宿題なので自信なし。(言い訳
ポインタを理解してないことが見破られ兼ねないッ!!!
なので朝やります。

とりあえず、書けてなかった事を追記。

と、自分がまず第一にポインタと配列を隔てるのは(似たような表記で書かれようと)
「置かれる場所が違う」
「構文の意味が違う」
ってことだと考えてます。

int main()
{
    char* message1 = "Hallo World.";
    char message2[] = "Hallo World.";
    message1[1] = 'o';
    message2[1] = 'o';
    printf("%s\n", message1);
    printf("%s\n", message2);
    return 0;
}

きむら(Kさんの例に似ているけれど、(本質は違う=配列とポインタの解釈をミスると駄目よ、というのとは違う
どっちかは実行したら場合によっては落ちます。(gcc 4.0.1 IntelMac で確認。
書き込んじゃいけない場所に書き込む(ことがある)からです。
処理系及び、リンカスクリプトなどで指定していればその限りではありません。(要するに未定義

const char* hoge1()
{
    char* message1 = "pointer";
    return message1;
}

const char* hoge2()
{
    char message2[] = "array";
    return message2;
}

int main()
{
   printf("%s\n", hoge1());
   printf("%s\n", hoge2());
}

どっちかは正しく表示されません。
確保されるべき場所が違うからです。
不思議なのは「ポインタを理解している」という人に限って、
メモリマップを理解していないということ。
誰の事ではないのですが、
リンカスクリプト? なにそれ? おいしいの?」
っていう人が「ポインタを理解した」とは言ってはいけないと思います。
少なくともポインタと配列の動作に加え、
.text、.rodata、.data、.bssなどについて説明できなければ、
ポインタを理解した、とは言えないでしょう。
どこにどうやってデータがあるのかを理解してないということだからです。
翌朝に続く……。(といいな