みえるCお試し版

ラボ(単体で使える道具)

C言語のポインタとメモリを、1行ずつ動かして見る

ポインタがわかりにくいのは、メモリの中が見えないから。ここでは、書いた C のコードをブラウザで1行ずつ動かして、変数の箱・番地・ポインタが指す先を図で確かめられる。環境構築は不要。

できること

使い方(3ステップ)

  1. 「ラボを開く」を押す。はじめから見本のコードが入っている。
  2. コードを書きかえる(下の例を開いてもよい)。
  3. 「動かす」を押して、1行ずつ進める。図の中の箱と、ポインタの線を見る。

例のコード(押すとラボで開く)

ポインタで、別の変数の中身を書きかえる

p には a の番地が入る。*p = 25 のところで、a の箱の中身が 10 から 25 に変わるのが見える。

#include <stdio.h>

int main(void) {
    int a = 10;
    int *p = &a;
    *p = 25;
    printf("%d\n", a);
    return 0;
}

配列とポインタ(p + 1 はどこを指すか)

int は4バイトなので、p + 1 は番地が4つ先の「となりの箱」を指す。1行ずつ進めると、指す線が動く。

#include <stdio.h>

int main(void) {
    int a[3] = {10, 20, 30};
    int *p = a;
    printf("%d\n", *p);
    p = p + 1;
    printf("%d\n", *p);
    *(p + 1) = 99;
    printf("%d\n", a[2]);
    return 0;
}

関数に番地を渡して、2つの変数を入れかえる

swap の中の x と y は、main の a と b を指している。関数の中から、呼び出し元の箱を書きかえる様子が見える。

#include <stdio.h>

void swap(int *x, int *y) {
    int t = *x;
    *x = *y;
    *y = t;
}

int main(void) {
    int a = 3;
    int b = 7;
    swap(&a, &b);
    printf("%d %d\n", a, b);
    return 0;
}

よくある質問

環境構築やインストールは要る?
要らない。ブラウザで開くだけで動く。コンパイラの導入も、アカウントの登録も無い。
本物の C コンパイラと同じ?
ちがう。学習用に作った C の解釈系で、入門で使う範囲(整数・小数・文字・配列・ポインタ・構造体・関数・malloc と free・printf と scanf など)に対応している。対応していない書き方に当たると「この学習用Cでは未対応」と表示して止まる。
ファイル入出力は動かせる?
動かせない。fopen などのファイル入出力は未対応。ほかに union、goto、可変長配列、#include "..."(自分のヘッダ)も未対応。
表示される番地は、本物と同じ?
同じではない。番地は学習用に決めた値で、実際のパソコンでは毎回ちがう番地になる。大きさは int が4バイト、ポインタが8バイトで計算している。
scanf などの入力は使える?
使える。入力の欄に書いた文字を、キーボードから打ったものとして読む。
書いたコードは、どこかに送られる?
送られない。実行はすべてブラウザの中で行う。「このコードのリンクをコピー」で作るリンクも、コードをリンクの文字の中に入れているだけ。
どこまで無料?
コードを書いて動かす、1行ずつ進める・もどる、変数とポインタの図を見る、リンクで共有する、までが無料。malloc した領域(ヒープ)の中身の図、解放し忘れの指摘、誤りのくわしい説明(なぜ起きたか・直し方)、コードの保存は有料版の機能。
スマホでも使える?
使える。図は画面が広いほうが見やすいので、じっくり読むならパソコンかタブレットが向いている。

ポインタを、順を追って学ぶ

メモリとは巨大なロッカー群

駅のコインロッカーを思い浮かべてください。壁一面に扉が並び、どの扉にも「1番」「2番」「3番」と番号が振ってあります。荷物を預けたあとに覚えておくのは、中身ではなく番号だけ。番号さ…

アドレス——すべての箱に番地がある

前のレッスンで、メモリのロッカーには1つずつ番地が振られていると学びました。ここでは、その番地がいつ・どうやって決まるのかを見ていきます。 番地は変数を作った瞬間に決まる int …

ポインタとは「宛先メモ」

友達に本を届ける方法は2つあります。1つは本そのものを手渡す方法。もう1つは「その本は市立図書館の3階、棚B-12にあります」と書いたメモを渡す方法です。 C言語のポインタは、後者…

& と *——住所を書く・訪ねる

ポインタで使う記号は2つだけです。& と *。この2つの意味を取り違えないことが、最大の関門です。 & は「住所を調べる」 トラック10で使った演算子です。変数の前に付けると、その…

この先へ ポインタ・メモリ・構造体・ファイル入出力まで、全26トラック・211レッスン・演習508問は有料版に入っている。

有料版(BOOTH)を見る

姉妹品: 手を動かして覚える Linux 教材 Linux とインフラの仕組みを地図で学ぶ

Web 版 / BOOTH