値渡しと参照渡し
引数が関数に渡される仕組みを学びます。
「値渡しと参照渡し」はCoddyKit上の無料Zig Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはZig Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Zig Academyコースには全4レッスンが含まれています。
引数の渡り方
関数を呼び出すと、Zigはデータを関数内に渡す必要があります。方法は2つあり、値そのものを渡すか、値への参照を渡します。🚚
値渡しではコピーされる
デフォルトでは、プリミティブ型の引数は値渡しされます。関数は独自のコピーを受け取るため、元の値を変更できません。
fn addOne(n: i32) i32 {
return n + 1;
}コピーは独立している
コピーなので、関数内での変更が呼び出し元に影響することはありません。外側の変数は、元の状態のままです。
パラメーターは不変
Zigの関数パラメーターは不変です。関数本体内でパラメーターに再代入できないため、意図が明確になります。
ポインターを渡して共有する
関数からデータを変更できるようにするには、ポインターを* Tの形で渡します。関数はコピーではなく、実際の値を操作します。
fn bump(n: *i32) void {
n.* += 1;
}デリファレンスしてアクセスする
関数内では.*を使って、ポインター経由で値を読み書きします。n.* += 1とすると、呼び出し元が保持している値が更新されます。
&でアドレスを取得する
呼び出し側では、&を使ってアドレスを渡します。これにより、bump(&count)で関数からcountを直接変更できます。
var count: i32 = 0;
bump(&count); // count is now 1大きなデータには参照が適している
大きな構造体をコピーするのは非効率的です。constポインターを渡せば、変更を許可せずに低コストでデータを共有できます。
fn area(r: *const Rect) i32 {
return r.w * r.h;
}constポインターは読み取り専用
*const Tを使うと、関数はデータを読み取れますが、書き込むことはできません。安全性を保ちながら高速に処理できます。
スライスはすでにビュー
スライスは[]const u8のように、ポインターと長さを保持します。そのため、全体をコピーせずに基になるデータを共有できます。
意図に応じて選ぶ
小さく読み取り専用のデータには値渡しを使い、変更が必要な場合やデータが大きい場合はポインターを渡します。
クイックチェック
関数から呼び出し元の変数を変更したいとします。どのパラメーター形式を使えばよいでしょうか?
まとめ
値はコピーされるため元の値を変更できませんが、ポインターなら共有できます。変更には*Tを使い、大きなデータを高速に読み取るには*const Tを使います。🎯
よくある質問
「値渡しと参照渡し」レッスンは無料ですか?
はい。「値渡しと参照渡し」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Zig Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Zig Academyコースには全4レッスンが含まれています。
「値渡しと参照渡し」で何を学びますか?
引数が関数に渡される仕組みを学びます。 ブラウザで直接実行するハンズオンコードでZig Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Zig Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのZig Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「値渡しと参照渡し」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このZig Academyレッスンでコードを書いて実行できますか?
はい。すべてのZig Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 関数の構文と戻り値の型
- 値渡しと参照渡し
- pub関数と可視性
- 再帰と複数の戻り値