C言語アドレス伝達と値伝達


1、C言語では、すべての非配列形式のデータ実パラメータは値伝達の形式で呼び出され、値伝達の過程で、呼び出された関数の形式パラメータはその関数の局所変数と見なされ、すなわちメモリのスタックに空間を開き、主調関数から入れられた実パラメータの値を格納し、実パラメータのコピーとなる.したがって、呼び出された関数は、実パラメータとしての実際の変数の値を変更することはできず、彼に渡されたバックアップを変更するしかありません.
2、アドレス伝達過程において、被変調関数のパラメータも局所変数としてスタックにメモリ空間を開いたが、このとき格納されているのは主変調関数から入ってきた実パラメータ変数のアドレスであり、被変調関数のパラメータに対するいかなる操作も間接アドレス検索、すなわちスタックに格納されているアドレスを通じて主変調関数の実パラメータ変数にアクセスするように処理される.そのため,被変調関数がパラメータに与える任意の操作は,主変調関数における実パラメータ変数に影響を及ぼす.
3、また、関数に配列を渡すことができないという問題もあります
次のことを確認できます.

void fun(char a[10])
{
	int i = sizeof(a);
	char c = a[3];
}


配列が本当に関数内部に渡されると、iの値は10になるはずですが、残念ながら、iの値は4で、確かに渡されません.
C言語では,1次元配列が関数のパラメータである場合,コンパイラは常にそのヘッダ要素アドレスを指すポインタに解析する.
上記の値の伝達とアドレスの伝達について、以下はコードで問題を説明します.

/*
 * main.c
 *
 *  Created on: Apr 28, 2012
 *      Author: root
 */

#include <stdio.h>

void swap_val(int x, int y)
{
	int temp;

	temp = x;
	x = y;
	y = temp;

	printf("x = %d, y = %d
", x, y); } void swap_addr(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } int main(void) { int a, b; printf("please input two integer
"); scanf("%d %d", &a,&b); if (a < b) { swap_val(a, b); printf("a = %d, b = %d
", a, b); swap_addr(&a, &b); printf("a = %d, b = %d
", a, b); } return 0; }  

検証結果は次のとおりです.
please input two integer 1 2 x = 2, y = 1 a = 1, b = 2 a = 2, b = 1