多くの場合、混乱を招くポインター、特殊なポインター、メイン関数のパラメーターの受け渡し

しばしば混乱を招くポインタ

最初のグループ

  1. int *a[10];
    これはポインターの配列であり、配列 a には 10 個の整数ポインター変数がありますa[0] - a[9]
  2. int (*a)[10];
    配列ポインター変数。ポインター変数です。4 バイトを占め、アドレス番号を格納します。
    これは配列を指し、1 を加えると次の配列を指します。
  3. int **p;
    これは、ポインタ変数のアドレスを保持するポインタへのポインタです。
    ポインタのアドレスを保持するためによく使用されます。
  • 一般的な使用法 1:
int **p;
int *q;
p = &q;
  • 一般的な使用法 2:
int **P;
int *q[10];
// q是指针数组的名字,是指针数组的首地址,是q[0]的地址。
// q[0]是个int *类型的指针。 所以q[0]指针变量的地址,是int **类型的

第二グループ

  1. int *f(void);
    注:*f括弧で囲まれていません。
    これは関数の宣言であり、宣言された関数の戻り値の型は int * です。
  2. int (*f)(void);
    *f括弧はdescription*を変更するために使用され、これはポインター変数であることに注意してください。これは関数ポインタ変数であり、関数のアドレスを格納します。この変数が指す関数には戻り値が int でなければならず、パラメータは必要ありません。ff
    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;
}

おすすめ

転載: blog.csdn.net/shuting7/article/details/129913240