木を植えるのに最適な時期は10年前で、今がそれに続きます。
エラーを指摘してください、ありがとうございます〜
1つ、ポインタ変数
ポインタ変数について説明する前に、アドレスについて説明します。最近のほとんどのコンピュータでは、メモリはバイトに分割されており、各バイトには01010101などの8ビットの情報を格納でき、各バイトには一意のアドレスがあります。
一部の変数は1バイト以上のメモリ空間を占有し、最初のバイトのアドレスはこの変数のアドレスと見なされます。
1.ポインタ変数は、変数のアドレスを格納する変数です。
2.ポインタ変数宣言:
たとえば、過去には整数変数int aを宣言しました。次に、ポインタ変数の宣言について説明します。通常、ポインタ変数を宣言するときは、p(英語の単語pointの最初の文字から取得)を使用します。整数変数を表すポインタ。このようにint * pを宣言します; 、ポインタpは、int型のオブジェクトを指すポインタ変数であるとも言えます。int pの場合、整数変数が宣言され、この整数変数の前に*記号が追加されます。これは、宣言されたpがポインター変数であることを示します。
2.&および*:アドレス演算子と間接アドレス演算子を使用します。
C言語を学び始めたときに出会ったscanf( "%d"、&a);という文を今でも覚えていますか?あなたはこのことをよく知っている必要があります!
1.アドレス演算子を取ります&
名前が示すように、&aなどは、変数aのアドレスを取り出すことです。
ポインタ変数は、変数のアドレスを表す変数です。ポインタ変数の初期化には、アドレス記号を使用します。
2.ポインタ変数の初期化
ポインタpを使用する前に、ポインタpを初期化する必要があります。
//方法一:
int i, *p;
p = &i;
//方法二:
int i;
int *p = &i;
//甚至也可以这样:
int i,*p = &i;
3.間接アドレス指定演算子*
この*(間接アドレス指定)演算子をint * p; *!と混同しないでください。
ポインターp変数がオブジェクトを指している場合、* pを使用してオブジェクトに保管されているコンテンツにアクセスできます。
pのみがiを指し、* pはiのエイリアスです。
例えば:
int a = 3;
int *p = &a;
printf("%d",*p);
このコードの出力は、変数a3の内容です。
3、ポインターの割り当て
#include<stdio.h>
int main()
{
int i = 0,j = 1;
int *p = &i,*q = &j;
//至此我们定义并初始化了两个整形变量和两个指针,p指向i,q指向j
*p = 3;
*q = 4;
//对指针进行赋值,因为指针直接指向变量的地址,所以对*p *q进行赋值时就直接会改变他们指向的变量的值
//因此到这里 i为3, j为4
printf("*p = %d\n*q = %d\n",*p,*q);
printf("i = %d\nj = %d\n",i,j);
return 0;
}
結果は次のとおりです。
第四に、ポインタはパラメータです
1.パラメータを関数に渡すとき、実際のパラメータの値は変更されないことは誰もが知っています。たとえば、関数の実際のパラメータの値を変更したい場合は、どうすればよいでしょうか。それを返し、メイン関数で再割り当てしますか?しかし、2つ、3つ、または4つを変更したい場合はどうでしょうか。
たとえば、値を交換する関数を作成するには、a = 10; b = 3; c = 9;これらの3つの変数の値を2つずつ交換するには、交換はa = 3; b = 9; c = 10;次のように記述します。abcの3つのパラメーターを単純に渡すと、関数の内部交換後、それらは関数後の元の値のままになります。
#include<stdio.h>
int swap(int a,int b,int c);
int main()
{
int a = 10,b = 3, c = 9;
swap(a,b,c);
printf("a=%d b=%d c=%d \n",a,b,c);
return 0;
}
int swap(int a,int b,int c)
{
int t;
t = a;
a = b;
b = c;
c = t;
return 0;
}
走った後、彼の結果は変わっていないことがわかります、どうすればいいですか?
パラメータとしてポインタを使用してください!ポインターはこの変数のアドレスを指すことができるため、* pの割り当てを使用して、変数の値を直接変更できます。
#include<stdio.h>
int swap(int *a,int *b,int *c);
int main()
{
int a = 10,b = 3, c = 9;
swap(&a,&b,&c);
printf("a=%d b=%d c=%d \n",a,b,c);
return 0;
}
int swap(int *a,int *b,int *c)
{
int t;
t = *a;
*a = *b;
*b = *c;
*c = t;
return 0;
}
しばらく行って実行してください〜
2.このように、ポインターにはもう1つのアプリケーションシナリオがあります。関数は1つの戻り値しか持てず、複数の結果が必要な場合は、ポインターを使用して複数の結果を引き出すことができます。
もちろん、エラーが発生しやすい操作で、戻り値として-1または0を使用して失敗を示している場合、エラーがない場合は、ポインターを使用して結果を送信することもできます。
3. constを試してみますか?
constは変数、定数変数を定義します。constで定義された変数の値は変更できません。読み取り専用変数を定義していると言えます。これは、定義時に初期値を割り当てる必要があることも意味します。
constでパラメータを保護できます
ポインタパラメータを渡して変更したくない場合があるので、constするだけです。(変数に多くのストレージスペースが必要な場合、この時点で変数の値を渡すと、時間とスペースが無駄になります)
これらはポインタに関する最も基本的なことであり、次にポインタと配列、動的メモリ割り当てなどが続きます。
一緒に来てください〜!