1.0はじめに
ポインターを聞くことを恐れないでください、ポインターはそれほど難しくありません
1.1&-----アドレス文字を取る
はじめに:
C言語を学ぶこの学生は、長い間連絡を取り合っていた可能性があります。scanfで入力を行うときは、「&」を追加する必要があることも強調しました。そうしないと、プログラムがクラッシュします。それでは、この不思議な「&」を理解しましょう。
注:すべての変数には特定の値があり、値がある場合はスペースを占有し、コンパイラーはこの変数に値を格納するためのアドレスを見つけます。
機能:変数のアドレスを取得します。オペランドは変数のみにすることができます
注:変数のアドレスは16進数で表されます
試してみよう:
#include<stdio.h>
int main(void)
{
int a = 10;
printf("0x%x",&a);
}
この時点で警告が報告されます。
パラメータのタイプはunsignedintですが、指定された&aはint *タイプです。
これは気にせず、操作の結果を確認できます。
しかし、なぜこの警告があるのですか?%xを%pに変更するだけです。%pはアドレスを印刷するためのものです。これは16進形式であり、印刷される桁数、つまり印刷されます。左側の空きは0で埋められますので、0xを追加しなくても正しく出力できます
#include<stdio.h>
int main(void)
{
int a = 10;
printf("%p",&a);
return 0;
}
参照してください、変数aのアドレスも取得しました:0x22fe4c
1.2ポインタ
はじめに:
外部からその変数の値にアクセスできるように、変数のアドレスを取得できますか?
ポインタを使用します。
- ポインタはアドレスを保持する変数です
- ポインタはアドレスを取得し、対応する変数の値にアクセスできます
例えば:
#include<stdio.h>
int main(void)
{
int i = 10;
int* p = &i;
printf("&i的值为:%p\n",&i);
printf("p的值是:%p",p);
return 0;
}
操作結果:
ご覧のとおり、iのアドレスはpの値と同じです!実際、彼らは次のことを行いました。
要約:
- 通常の変数の値は実際の値です
- ポインタ変数の値は、彼が指す変数のアドレスです。
1.3 *演算子
以前にも「*」演算子について説明しましたが、計算するための乗算演算子として「*」を使用します。ここで言及されている*は、単一演算子です。
使用法:*アドレス
機能:指定されたアドレス
の値を取得します。これは、アドレスを介して値にアクセスできるツールです。したがって、*演算子によって取得される値は、iの対応するアドレスの値です。保存されている値は10なので、%dで試してみましょう。
#include<stdio.h>
int main(void)
{
int i = 10;
int* p = &i;
printf("*p的值为:%d\n",*p);
printf("*&i的值是:%d",*&i);
return 0;
}
- * pと*&iの値はどちらもiの値であり、10です。実際、これは簡単に理解できます。pの値はiのアドレスです。pの前に*を追加して10を取得します。*&iの場合、&iは最初にiのアドレスを取得し、次に*を追加してiの値を取得します。
- ポインタの前に*記号がある場合、それは通常の変数であり、値はそれが指す変数のアドレスであることが一時的に理解できます。
* pの値を変更すると、それが指す変数の値も変更されますか?試してみよう。
#include<stdio.h>
int main(void)
{
int a = 4;
int b = 5;
int *p = &a;
int *q = &b;
printf("a的值为:%d\n",a);
printf("b的值为:%d\n",b);
printf("这里试图用指针来改变a、b的值:\n");
*p = 7;
*q = 7;
printf("改变后a的值为:%d\n",a);
printf("改变后b的值为:%d\n",b);
return 0;
}
他の関数で変数値を変更してみましょう。
#include<stdio.h>
void f(int *a,int *b);
void q(int a,int b);
int main(void)
{
int a = 4;
int b = 5;
printf("原本a、b的值是:%d,%d\n\n",a,b);
f(&a,&b);//把a、b的地址传进f函数,在f函数里用改变后 ,在那个地址上的a、b也会发生改变
printf("被f函数用指针修改后的a、b的值是:%d,%d\n\n",a,b);
q(a,b);//把a、b的值传进q函数,只是复制一份a、b的值,所以main函数里的a、b不会改变
printf("被q函数修改后的a、b的值是:%d,%d\n\n",a,b);
return 0;
}
void f(int *p,int *q)
{
printf("这里试图在f函数里用指针修改a、b的值;\n");
*p = 7;
*q = 7;
}
void q(int a,int b)
{
printf("这里试图在q函数里修改a、b的值;\n");
a = 6;
b = 6;
}
aとbの値が変更されました!言い換えると:
- ポインタは、それが指す変数に書き込み、その値をどこでも変更できます。
- 関数内の変数は関数外には存在しません
- aとbを関数に直接渡すことは、その値のコピーにすぎません。関数の内部と外部の間に接続はありませんが、アドレスが関数パラメーターに渡されると、それ自体を受け取ります。
1.4ポインタの基本的な知識ポイントの要約
1.5ポインタのアプリケーションシナリオ
2つの変数の値を交換する:たとえば
、関数を作成し、2つの変数の値をパラメーターに渡します。その関数では、それらを交換できますが、渡すのはコピーであるため、関数を離れると意味がありません。上の値。ポインタができたので、2つのアドレスを渡し、そのアドレスを使用して上記の値を変更できます。
関数パラメーターのポインターの値を変更する場合は、ポインターのポインターのみを関数に渡すことができます。
#include<stdio.h>
void swap(int *pa,int *pb);
int main(void)
{
int a = 4;
int b = 5;
swap(&a,&b);//把a和b的地址传进swap函数
printf("a=%d,b=%d\n",a,b);
return 0;
}
void swap(int *pa,int *pb)
{
int t = *pa;// *pa代表的变量是a,实际做的事是定义变量t,‘t = 4’。
*pa = *pb;// *pb代表的变量是b,实际做的事是‘a = 5 ’
*pb = t;// t的值是4,实际上做的事是‘b = 5’
}
それが実際に行うことはこれです:
int a = 4;
int b = 5;
int t;
t = a;//t = 4;
a = b;//a = 5;
b = t;//b = 4;