この記事の内容:ポインタのアスタリスクの3つの意味と、関数呼び出し時のポインタと実引数、仮引数との変数の受け渡し関係、呼び出し関数の通常変数の値を変更する方法呼び出された関数。
ポータル:
C言語ポインタ入力学習、概念検討(1)
C言語ポインタ入力学習、概念検討(2)
C言語ポインタ入力学習、知識ポイントコーミング(3)
C言語ポインタ入力学習、知識ポイント整理(4)
1. アスタリスク * の意味:
- 乗算
- ポインタ変数を定義します: int * p; //p という名前のポインタ変数を定義します。int * は、p が int 整数変数のアドレスのみを格納できることを意味します
- ポインタ演算子: 定義されたポインタ変数の前に配置され、p が定義されたポインタ変数の場合、p は p の内容をアドレスとして持つ変数 int * p を意味します
; P = 5 のアスタリスク アスタリスクは同じではありません。前者は p がポインター変数であることを示し、後者は値演算子を示します。*p は 5 に相当します。
C 言語変数の規則: 整数には ijkl、浮動小数点型には xyz、ポインターには pqst を使用します。
# include <stdio.h>
int main(void)
{
int * p; //该语句等价于 int *p; 也等价于int* p; 一般来说写法写int * p;
int i = 5;
char ch = 'A'; //单个字符必须用单括号,否则会被系统认成变量
p = &i; //正确,*p是以p的内容为地址的变量
*p = 99; //p接收了i的地址,所以*p就等同于i,即i的值为被赋值99
printf("i = %d, *p = %d\n", i, *p);
//p = &ch; //error 类型不一致
//p = ch; //error 类型不一致
//p = 5; //error
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------
运行结果: i = 99, *p = 99;
上記のプログラムを通じて、アドレスとポインタの働きを明確に理解し、p、*p、&i、int * p の区別に注意することは、ポインタを理解し、ポインタを学び、ポインタを使用するための基礎知識です。暗記しなければなりません。
# include <stdio.h>
void swap_1(int a, int b); //函数声明,此处还可以写成: void swap_1(int , int )
void swap_2(int * p, int * q) //形参名字不是*p,*q而是p,q,接收实参数据, 函数结束后释放p,q,所以光调换p,q值不影响主函数中的a,b
{
//C语言是值传递,此时p存放a的地址(如1000H),p也有自己的地址(如2000H),
int * t; //*p表示的是a地址中的数据(3),修改*p就会修改变量a的值。
t = p; p = q; q = t; //此处换的是p,q的地址,而没有换*p,*q,即主函数中a,b的地址和值都不变,所以输出结果还是a = 3, b = 5
}
void swap_3(int * p, int * q) //形参名字不是*p,*q而是指针变量p,q,接收实参数据(地址数据)
{
//C语言是值传递,此时p存放a的地址(如1000H),p也有自己的地址(如2000H),
int t; //*p,*q等同于a,b为int型,所以为保持类型一致,t也必须是整型int
t = *p; *p = *q; *q = t; //*p,*q虽然在子函数中,但通过地址可以直接修改主函数中a,b的值,输出结果为a = 5, b = 3
}
int main(void)
{
int a = 3;
int b = 5;
//swap_1(a, b); //不报错,但无法修改主函数中a,b的值,不能完成交换
//swap_2(a, b) //error:错误,形参是指针变量p和q,p要接收的是整型地址而不是整型变量,应改为swap_2(&a, &b);
//swap_2(&a, &b); //不报错,把a的地址传递给p,把b的地址传递给q。但是函数结束后主函数中a,b仍未完成交换
swap_3(&a, &b); //虽然调用函数结束后,形参指针变量p,q的值会被释放,但通过指针*p,*q,主函数中a,b的值已经被改写了,交换成功
printf("a = %d, b = %d\n", a, b);
return 0;
}
void swap_1(int i, int j) //返回值为void,可以直接写return; 也可以不写return,每调用一次return只能返回一个值
{
int t;
t = i; i = j; j = t; //等号两边类型一致,不报错,但修改形参的值不影响主函数变量,无法完成交换
//return; //return有返回值,终值函数的作用
}
------------------------------------------------------------------------------------------------------------------------
三个函数中,只有swap_3()才能完成交换,输出: a = 5, b = 3
其余两个函数,输出结果都是: a = 3, b = 5
一言でまとめると、仮引数、実引数、ポインタ変数、アドレス、アスタリスクの概念をしっかりマスターすることで、プログラム中の様々な変数に惑わされにくくなります。
1. 仮パラメータ交換、仮パラメータ p と q は関数呼び出し後に解放されるため、メイン main 関数の実パラメータ a と b に影響を与える方法がなく、交換を完了できません。
2. ただし、 の特性により、仮パラメータ p および q の実パラメータ a および b のアドレスをコピーすることで、 *p および *q を使用して、交換を完了するメイン関数。
3. 仮パラメータと実パラメータは常に異なります。それらは、異なる関数で異なる空間が割り当てられ、異なる変数に属します。main 関数から呼び出し関数に渡される値は、過去をコピーするのと同等であり、実際の値には影響しません。呼び出し側関数が main 関数変数のアドレスを持っている場合にのみ、実際のパラメータ変数を直接制御および変更でき、ポインタはアドレスを通じて呼び出し側関数内の main 関数の変数値をリモートで変更できます。
誘導: 呼び出された関数を通じて、呼び出した関数の通常の変数の値を変更するにはどうすればよいですか?
- 実際のパラメータは、関数名 (&a,&b) などの通常の変数のアドレスである必要があります。
- 仮パラメータは、int * p、int *q などのポインタ変数である必要があります。
- 呼び出される関数では、呼び出し関数の複数の関連変数の値を * 仮パラメータ名 = ... によって変更できます。
(能力には限界があり、このブログは大多数のネチズンの参考と研究のみを目的としています。不備があれば修正して一緒に進歩してください!)