Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 関数、配列、二重ポインタ | ポインタ
C基礎

book関数、配列、二重ポインタ

メニューを表示するにはスワイプしてください

ポインタを使った関数

データの値を変更する基本的な関数を試してみましょう。例えば、キロオームをオームに変換する関数が必要な場合を考えます(1 kOhm = 1000 Ohm)。

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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; }

配列を直接走査することはありません。配列のアドレス、特に最初の要素のアドレスのみを利用します。

question mark

C言語で関数が変数自体を渡された場合は値を変更できず、ポインタを渡された場合に値を変更できる理由として最も適切な説明はどれですか。

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 6.  5

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 6.  5
some-alt