GNU/Linux >> Linux の 問題 >  >> Linux

LinuxCプログラミングチュートリアルパート8-値による呼び出しとポインタ/アドレスによる呼び出し

この継続的なチュートリアルシリーズの最初のパートでは、宣言や本文など、関数について簡単に説明しました。当時私たちが話していなかったのは、関数が呼び出される複数の方法でした。ここで、このチュートリアルでは、存在する方法について簡単に説明します。

C言語では、いくつかの方法で関数を呼び出すことができます。値による呼び出しと、ポインターまたはアドレスによる呼び出しです。わかりやすい例をいくつか使って、これらの両方の概念について説明しましょう。

2つの値を交換するプログラムを作成するとします。方法は次のとおりです。

#include <stdio.h>

int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

c = a;
a = b;
b = c;

printf("\nSwapped values are: %d and %d", a,b);



return 0;
}

入力された値が5および9の場合のこのコードの出力は次のとおりです。

Enter two integer values
5 9

Entered values are: 5 and 9
Swapped values are: 9 and 5

ここで、要件が別の関数(たとえば、「swap」)を持つことであると仮定します。この関数は、すべてのスワッピング関連の作業を実行し、プログラマーが2つの値をスワッピングしたいときにいつでも呼び出すことができます。これを行うコードは次のとおりです。

#include <stdio.h>

void swap (int val1, int val2)
{
int temp = 0;

temp = val1;
val1 = val2;
val2 = temp;

printf("\nSwapped values are: %d and %d", val1,val2);

}

int main()
{
int a=0, b=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(a,b);

return 0;
}

さあ、行きます。 'swap'という名前の別の関数が作成されました。この関数は、2つの値(元々はユーザーによって入力され、'main'関数でキャプチャされたもの)を引数として受け取り、それらを交換して出力を出力します。

ここで「スワップ」が呼び出される方法は、「値による呼び出し」として知られています。理由は、呼び出しが行われると、「a」と「b」によって保持されている値のみが引数として「swap」関数に渡されるためです。これらの値は引数「val1」および「val2」によって受け取られ、スワッププロセスが実行されるのはこれらの変数です。

これは、「main」関数の変数「a」および「b」が、スワップ操作が実行された後も元の値を保持し続けることを意味します。しかし、「swap」関数を呼び出した後に「a」と「b」の値を交換する必要がある場合はどうなるでしょうか。さて、ここで「ポインタ/アドレスによる呼び出し」メソッドが登場します。

つまり、基本的にここで行うことは、変数のアドレス(この場合は「a」や「b」など)を引数として渡すことです。呼び出される関数(この場合は「swap」)は、引数としてアドレスを受け取るように装備されており、スワッププロセスはこれらのアドレスに保持されている値に対して実行されます。これは、元の変数(ここでは「a」と「b」)の値を意味します。 )交換されます。

さて、前の段落で、関数は「引数としてアドレスを受け取るように装備されている」と述べました。 「装備されている」とは、アドレスを受け取ることができる特別なタイプの引数があることを意味します。これらの引数は「ポインタ」型の変数です。 「ポインタ」については、今後のチュートリアルで詳しく説明しますが、今のところ、ポインタ変数はメモリアドレスを値として格納することに注意してください。

整数へのポインタが宣言/定義される方法は次のとおりです。

int *x;

したがって、基本的に、xは整数変数のメモリアドレスを格納するために使用できるポインタ変数です。 'i'が整数変数であるとすると、'x'に'i'のアドレスを格納させる方法は次のとおりです。

x = &i;

そして、「i」から「x」の値にアクセスしたいときはいつでも、「*x」と書きます。たとえば、「i」の値をたとえば10に変更する方法は次のとおりです。

*x = 10;

したがって、これらすべてを念頭に置いて、アドレスまたはポインタによる呼び出しメソッドを使用して「スワップ」を呼び出す方法は次のとおりです。

#include <stdio.h>

void swap (int *val1, int *val2)
{
int temp = 0;

temp = *val1;
*val1 = *val2;
*val2 = temp;

}

int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(&a,&b);

printf("\nSwapped values are: %d and %d", a,b);


return 0;
}

したがって、今回は、引数として「a」と「b」の値を渡す代わりに、これらの変数のアドレスを渡しました。 'swap'関数では、アドレスは2つのポインター変数('val1'と'val2')で受け取られます。そして、2つのポインター変数を使用して、ロジックは「a」と「b」の値を直接交換します。

出力は次のとおりです:

Enter two integer values 
6 8
Entered values are: 6 and 8
Swapped values are: 8 and 6

この記事では、関数呼び出しの「値による呼び出し」および「アドレス/ポインターによる呼び出し」の方法と、それらをいつ使用できるかについて、少なくとも基本的な考え方を説明する必要があります。ここにリストされている例を試してみて、疑問や質問がある場合は、以下のコメントでお知らせください。


Linux
  1. Cプログラミングチュートリアルパート3-変数の基本

  2. Cプログラミングチュートリアルパート5-文字変数

  3. LinuxCプログラミングチュートリアルパート10-可変スコープ

  1. Linux Cプログラミングチュートリアルパート9:文字列

  2. LinuxCプログラミングチュートリアルパート8-値による呼び出しとポインタ/アドレスによる呼び出し

  3. LinuxCプログラミングチュートリアルパート8-値による呼び出しとポインタ/アドレスによる呼び出し

  1. LinuxCプログラミングチュートリアルパート14-ビット演算子の実際の例

  2. LinuxCプログラミングチュートリアルパート12-代入演算子と条件式

  3. Linux Cプログラミングチュートリアルパート11-算術演算子、リレーショナル演算子、および論理演算子