関数、配列、二重ポインタ
メニューを表示するにはスワイプしてください
ポインタを使った関数
データの値を変更する基本的な関数を試してみましょう。例えば、キロオームをオームに変換する関数が必要な場合を考えます(1 kOhm = 1000 Ohm)。
Main.c
12345678910111213141516#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }
r 変数の値を変更しようとしましたが、うまくいきませんでした。これは、関数が r 変数のコピーを受け取っており、実際の値自体を受け取っていないためです。
プログラムを意図通りに動作させるには、r 変数のアドレスを関数に渡す必要があります。そのため、Ohm 関数は単なる double* ではなく、double を受け取る必要があります。
Main.c
1234567891011121314151617#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }
r 変数を2回参照している点に注意。Ohm 関数を呼び出した後、r の値は変更されている。これは、関数が r 変数の元のアドレスを受け取り、そのアドレスにある値を変更したため。
さらに、関数は生成したオブジェクトへのポインタを返すことも可能。
Main.c
123456789101112131415#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }
アドレスに数値(pX + 1)を加算すると、次のメモリセルのアドレスが得られます。RAMの「連続領域」を移動するループを記述してみましょう。
Main.c
12345678910#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }
3ステップ先まで予測しています。導き出されたアドレスから、明確な階層構造があることが分かります。
配列は本質的に、配列名で表される固定アドレスと割り当てられたメモリから構成されます。各要素のインデックスは、最初の要素のアドレスからのオフセットを示します。
この概念は、次のプログラムで確認できます。
Main.c
1234567891011#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }
配列を直接走査することはありません。配列のアドレス、特に最初の要素のアドレスのみを利用します。
すべて明確でしたか?
フィードバックありがとうございます!
セクション 6. 章 5
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 6. 章 5