学ぶ最大の理由は平凡を取り除くことであり、1日早ければ人生はより素晴らしくなり、1日遅ければさらに平凡になります。
勉強日記
目次
序文
ここでポインタは、「ポインタ変数」、「ポインタによって参照される配列」、「*ポインタによって多次元配列を参照する」、「ポインタによって参照される文字列」、「*関数へのポインタ」、「*関数」という8つの小さな部分に分割されます。ポインタ値を返す」、「*ポインタの配列と複数のポインタ」、「* 動的メモリ割り当てとそれへのポインタ変数」。
1. メモリの動的割り当てとは何ですか
グローバル変数はメモリ上の静的記憶領域に配置され、非静的ローカル変数(仮パラメータを含む)はメモリ上の動的記憶領域に配置され、この記憶領域はスタック(スタック)と呼ばれます。さらに、C 言語では、一時データを格納するための動的メモリ割り当て領域を確立することもでき、これらのデータはプログラムの宣言部分で定義する必要がなく、関数の終了まで解放する必要もありません。 、ただし、必要に応じていつでも開くことができ、いつでもリリースできます。これらのデータは、ヒープ(ヒープ)領域と呼ばれる特別な空き記憶領域に一時的に保存されます。必要に応じて必要なサイズのスペースをシステムに申請することができます。宣言部では変数や配列として定義されていないため、変数名や配列名では参照できず、ポインタのみで参照できます。
2. メモリの動的割り当てを確立する方法
malloc 関数を使用して動的ストレージ領域を開く
void*malloc(符号なし整数サイズ)
この機能は、メモリの動的記憶領域にサイズの長さの連続した領域を割り当てることです。仮パラメータのサイズのタイプは、符号なし整数として定義されます (負の数は許可されません)。この関数の値(つまり、「戻り値」)は、割り当てられた領域の最初のバイトのアドレスです。つまり、この関数はポインタ関数であり、返されるポインタは、割り当てられた領域の最初のバイトを指します。割り当てられた領域。
ポインタの基本型は void です。つまり、どのタイプのデータもポイントせず、純粋なアドレスのみを提供します。
calloc 関数を使用して動的ストレージ領域を開く
void*calloc(符号なしn,符号なしサイズ)
この機能は、メモリの動的記憶領域に size の長さの連続した n 個の領域を割り当てることであり、この領域は通常、配列を格納するのに十分な大きさです。calloc 関数を使用すると、1 次元配列の動的ストレージ領域を開くことができます。n は配列要素の数、各要素の長さは size です。これは動的配列です。
realloc 関数を使用して動的メモリを再割り当てする
void*realloc(void *p,unsigned int サイズ)
malloc 関数または calloc 関数を通じて動的スペースが取得されており、そのサイズを変更したい場合は、realloc 関数を使用して再割り当てできます。realloc 関数を使用して、p が指す動的空間のサイズを size に変更します。pの値は変わりません。再割り当てが失敗した場合は NULL を返します。
free関数を使用して動的ストレージ領域を解放します。
void free(void *p)
この機能は、ポインター変数 p が指す動的空間を解放し、空間のこの部分を他の変数で再利用できるようにすることです。p は、最後に calloc または malloc 関数を呼び出したときに取得された関数の戻り値である必要があります。
3、void ポインタ型
C99 では、基本型 void を持つポインター型が許可されます。どのタイプのデータもポイントしない、基本型が void (つまり、void* 型の変数) であるポインター変数を定義できます。その値を別のポインター変数に代入する場合、その値は、代入された変数の型に適合するようにシステムによって型変換されます。
int *pt;
pt=(int *)malloc(100); //malloc(100)是void *型,把它转换为int *型
知らせ
「void 型を指す」を「任意の型」を指すことができるデータとして理解するのではなく、「空の型を指す」または「特定の型を指さない」と理解する必要があります。
例
動的配列を作成し、5 人の生徒の成績を入力し、関数を使用してスコアが 60 未満の生徒がいるかどうかを確認し、不適格な成績を出力します。
#include <stdio.h>
#include <stdlib.h> //程序中用了malloc函数,应包含stdlib.h
int main()
{ void check(int *); //函数声明
int *p1,i; //p1是int型指针
p1=(int *)malloc(5*sizeof(int)); //开辟动态内存区,将地址转换成int *型,然后放在p1中
for(i=0;i<5;i++)
scanf("%d",p1+i); //输入5个学生的成绩
check(p1); //调用check函数
return 0;
}
void check(int *p) //定义check函数,形参是int*指针
{ int i;
printf("They are fail:");
for(i=0;i<5;i++)
if(p[i]<60) printf("%d ",p[i]); //输出不合格的成绩
printf("\n");
}
C言語のポインタ操作
C言語のポインタ操作(3) ※ポインタによる多次元配列の参照