学ぶ最大の理由は平凡を取り除くことであり、1日早ければ人生はより素晴らしくなり、1日遅ければさらに平凡になります。
記事の最後には、8 つの主要な項目の詳細な概要が記載されています。
勉強日記
目次
2. 住所型データには実際には 3 つの情報が含まれています
序文
ここでポインタは、「ポインタ変数」、「ポインタによって参照される配列」、「*ポインタによって多次元配列を参照する」、「ポインタによって参照される文字列」、「*関数へのポインタ」、「*関数」という8つの小さな部分に分割されます。ポインタ値を返す」、「*ポインタの配列と複数のポインタ」、「* 動的メモリ割り当てとそれへのポインタ変数」。
1. ポインタの意味
「ポインタ」とは、「指す」という関係を鮮やかに表現するC言語の比喩用語であり、その物理的な実現はアドレスによって実現されます。
&a は変数 a のアドレスであり、変数 a のポインタとも呼ばれます。
ポインタ変数とはアドレスを格納する変数であり、ポインタを格納する変数とも言えます。
ポインタ変数の値はアドレスであり、ポインタ変数の値はポインタであるとも言えます。
ポインタ変数はアドレス変数とも呼ばれ、その値がアドレスになります。
& はアドレス演算子、&a は a のアドレス、& はポインタ演算子であるとも言えます。
&a は変数 a へのポインタ (つまり、変数 a へのポインタ) です。
配列名は、配列の最初の要素のアドレスであるアドレスであり、配列の最初の要素のポインタであるポインタであるとも言えます。
関数名はポインタ(関数コード領域の先頭バイトを指す)であり、関数名はアドレス(関数コード領域の先頭バイトのアドレス)であるとも言えます。
関数の実引数が配列名であれば、仮引数に渡されるのはアドレスであり、仮引数に渡されるのはポインタとも言えます。
2. 住所型データには実際には 3 つの情報が含まれています
① メモリ番号の純粋なアドレスを示します。
② 自身の型、つまりポインタ型。
③それによって識別される記憶装置にどのようなタイプのデータが格納されているか、つまりベースタイプ。
int a;
/* &a为a的地址,它就包括以上3个信息,它代表的是一个整型数据的地址,int是&a的基类型(即它指向的是int型的存储单元)。&a就是“指向整型数据的指针类型”或“基类型为整型的指针类型”,其类型可以表示为“int *”型。*/
ポインターとポインター変数を区別するため。ポインタはアドレスであり、ポインタ変数はアドレスを格納するために使用される変数です。
ポインタ変数の場合、そのアドレスがポインタ変数に格納されているアドレスは、ポインタ変数によって指されていると言われます。
int a,*p; //p是int*型的指针变量,基类型是int型
float b;
p=&a; //a是int型,合法
p=&b; //b是float型,类型不匹配
void * ポインターは、いかなる種類のデータもポイントしない特別なポインターです。このアドレスを使用して特定の型のデータを指す必要がある場合は、最初にアドレスに対して型変換を実行する必要があります。
3. ポインタ変数の帰納的比較
変数の定義 |
型表現 |
意味 |
int i; |
整数 |
整数変数 i を定義する |
int *p; |
int * |
p を整数データを指すポインタ変数として定義します。 |
int a[5]; |
整数 [5] |
5 つの要素を持つ整数配列 a を定義します |
int *p[4]; |
int *[4] |
整数データを指す 4 つのポインター要素で構成されるポインター配列 p を定義します。 |
int (*p)[4]; |
int (*)[4] |
p は 4 つの要素を含む 1 次元配列を指すポインタ変数です。 |
int f(); |
int() |
f は整数の関数値を返す関数です |
int *p(); |
int *() |
p は整数データへのポインタを返す関数です |
int (*p)(); |
int (*)() |
p は整数値を返す関数へのポインタです。 |
int **p; |
整数** |
p は、整数データを指すポインタ変数を指すポインタ変数です。 |
ボイド *p; |
空所 * |
p はポインター変数であり、基本型は void (空の型) であり、特定のオブジェクトを指しません。 |
4. ポインタ演算
ポインタ変数に整数を加算(減算)します。
p++; //将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加
ポインタ変数の代入
ポインタ変数に変数アドレスを代入します。ポインタ変数には整数を代入しないでください。
p=&a; //将变量a的地址赋给p
p=array; //将数组array首元素地址赋给p
p=&array[i]; //将数组array第i个元素的地址赋给p
p=max; //max为已定义的函数,将max的入口地址赋给p
p1=p2; //p1和p2是基类型相同指针变量,将p2的值赋给p1
2 つのポインター変数を減算できます
両方のポインター変数が同じ配列内の要素を指している場合、2 つのポインター変数の値の差は 2 つのポインター間の要素の数になります。
2 つのポインター変数の比較
2 つのポインターが同じ配列の要素を指している場合、それらを比較できます。前の要素を指すポインタ変数は、次の要素を指すポインタ変数よりも「小さい」です。p1 と p2 が同じ配列を指していない場合、比較は無意味です。
空の値
ポインター変数は null 値を持つことができます。つまり、ポインター変数はどの変数も指しません。NULL は、整数 0 を表す記号定数です。NULL は stdio.h ヘッダー ファイルで定義されています。 #define NULL 0 これにより、p がアドレス 0 のユニットを指すようになります。システムは、ユニットが他の目的に使用されないことを保証します (有効なデータは保存されません)。
p の値が NULL であることと、p に値が割り当てられていないことは、2 つの異なる概念です。前者は値を持ち (値は 0)、変数を指しません。後者は p に値を割り当てませんが、p に値がないわけではありませんが、その値は予測不可能な値です。 、p は未知の変数、指定された単位を指す可能性があります。
五、ポインタの利点
プログラムの効率を向上させます。
関数の呼び出し時にポインタが指す変数の値が変化すると、それらの値は呼び出し関数で使用できます。つまり、関数呼び出しから複数の変更可能な値を取得できます。
動的なメモリ割り当てを実装できます。
ポインタが不適切に使用されると、隠れた障害が発生し、発見やトラブルシューティングが困難になります。したがって、ポインタは細心の注意を払って使用してください。
C言語のポインタ操作
C言語のポインタ操作(3) ※ポインタによる多次元配列の参照