しばしば混乱を招くポインタ
最初のグループ
int *a[10];
これはポインターの配列であり、配列 a には 10 個の整数ポインター変数がありますa[0] - a[9]
。int (*a)[10];
配列ポインター変数。ポインター変数です。4 バイトを占め、アドレス番号を格納します。
これは配列を指し、1 を加えると次の配列を指します。int **p;
これは、ポインタ変数のアドレスを保持するポインタへのポインタです。
ポインタのアドレスを保持するためによく使用されます。
- 一般的な使用法 1:
int **p;
int *q;
p = &q;
- 一般的な使用法 2:
int **P;
int *q[10];
// q是指针数组的名字,是指针数组的首地址,是q[0]的地址。
// q[0]是个int *类型的指针。 所以q[0]指针变量的地址,是int **类型的
第二グループ
int *f(void);
注:*f
括弧で囲まれていません。
これは関数の宣言であり、宣言された関数の戻り値の型は int * です。int (*f)(void);
*f
括弧はdescription*
を変更するために使用され、これはポインター変数であることに注意してください。これは関数ポインタ変数であり、関数のアドレスを格納します。この変数が指す関数には戻り値が int でなければならず、パラメータは必要ありません。f
f
f
特別なポインタ
void 型へのポインタ ( void * )
char 型のポインタ * は char 型のデータを指します;
int 型のポインタ * は int 型のデータを指します;
float* 型のポインタは float 型のデータを指します;
void * は void 型のデータを指しますか? いいえ、void 型の変数が存在しないためです。
対応する型のポインタは、対応する型 void* 一般ポインタのデータ アドレスのみを格納でき
、どの型のポインタでも void* 型のポインタ変数に値を代入できます。主に関数のパラメータの位置や戻り値に使用されます。
int *p
void *q;
q=p; // 是可以的,不用强制类型转换
例:
functionvoid * memset(void *s,int c,size_t n);
この s が指すメモリの最初の n バイトをすべて c に割り当てることです。
Memset は文字配列、整数配列、および浮動小数点配列の内容を設定できるため、最初のパラメーターは汎用ポインターである必要があります。
戻り値は s が指すメモリの最初のアドレスですが、これは異なる種類のアドレスである可能性があります。したがって、戻り値も汎用ポインタでなければなりません。
注: void* 型のポインタ変数もポインタ変数であり、32 ビット システムでは 4 バイトを占有します。
ヌル
ヌルポインタ:
char *p=NULL;
p がどこを指していないか、または p がメモリ番号 0 の記憶装置を指していると考えることができます。
p の 4 バイトには 0x00 00 00 00 が格納され、ポインタの初期化には通常 NULL が使用されます。
main関数はパラメータを渡します
int main(int argc, char *argv[])
argc
: コマンド端末によって渡されるパラメータの数を識別する int 型の変数です;
argv
: 各コマンド端末によって渡されるパラメータを保存するために使用されるポインタの配列です。
#include <studio.h>
int main(int argc, char *argv[])
{
int i;
printf("argc = %d\n", argc);
for(i=0;i<argc;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
return 0;
}