配列ポインタの下付きの使い方、配列ポインタを不正に定義した場合の問題、scanf()の使い方補足
5689 ワード
----------文字列と文字ポインタ
上記の例に関する知識点:1,文字ポインタ定義文字列.2文字ポインタ文字列を定義すると、文字列はそのヘッダアドレスを文字ポインタ変数に割り当てます.3,文字列はメモリに文字配列として格納されるので,配列の属性を備え,ポインタ演算によりダウンスケール移動を実現して異なる要素の値を取得し,修正することができる.4文字列を個別に印刷するには、%c形式で*+ポインタ変数名で値をとる必要があります.5,文字列ヘッダを印刷できますが、この場合は%s形式でヘッダを印刷すればいいだけです.
----------配列ポインタにも下付き
int*p=aまたは&a[0]の場合、p[i]はa[i]に等しく、アドレスではなく値であることに注意してください.int*p=a[i];ではp[j]=a[i+j]とする.文字列を定義する文字ポインタ*p 1="Hello World";同様にp[i]で文字列の要素の値をとることができ、市場は前の知識点第4条を参照することに注意する.
------配列ポインタが正しく定義されていない場合:
現象解釈:int(*p 1)[2]=a;定義するのは1つの指向列数が2の配列であり、下付きの移動時に配列a[3][4]をaとする[6[2]int(*p 1)[6]=a;定義されているのは、列数2を指す配列であり、下付きの移動時には配列a[3][4]をaとする[2][6]
--------関数scanf()用法補足:
前回のブログでは、関数scanf()は、スペース、インデント、リターンを受け入れず、遭遇すれば入力が終了すると書いてありました.しかし、連続入力時にどのように間隔を置くかというと、scanf(「%d,%d,%d,%d」,&a,&b,&c)この場合カンマ間隔scanf(「%d%d%%d」,&a,&b,&c)を使用できます.この場合、リターン間隔scanf(「%d%d%%d」,&a,&b,&c)を使用できます.
#include
void main()
{
char *p; // p
p = "hello China"; // "hello China" p
*(p + 1) = 'g'; // 'g'
printf("
%c",*(p+1)); // , 'g'
printf("
%s",p); // "hgllo China"
getchar();
}
上記の例に関する知識点:1,文字ポインタ定義文字列.2文字ポインタ文字列を定義すると、文字列はそのヘッダアドレスを文字ポインタ変数に割り当てます.3,文字列はメモリに文字配列として格納されるので,配列の属性を備え,ポインタ演算によりダウンスケール移動を実現して異なる要素の値を取得し,修正することができる.4文字列を個別に印刷するには、%c形式で*+ポインタ変数名で値をとる必要があります.5,文字列ヘッダを印刷できますが、この場合は%s形式でヘッダを印刷すればいいだけです.
----------配列ポインタにも下付き
#include
void main()
{
int a[5] = {1,2,3,4,5};
int *p = a;
char str[] = "hello world";
char *p1 = str;
printf("
%d",p[2]); // 3, “*”
printf("
%c",p1[7]); // ‘o’, “*”
getchar();
}
int*p=aまたは&a[0]の場合、p[i]はa[i]に等しく、アドレスではなく値であることに注意してください.int*p=a[i];ではp[j]=a[i+j]とする.文字列を定義する文字ポインタ*p 1="Hello World";同様にp[i]で文字列の要素の値をとることができ、市場は前の知識点第4条を参照することに注意する.
------配列ポインタが正しく定義されていない場合:
#include
void main()
{
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p1)[2] = a; //windows , int (*)[2] int (*)[4]
int (*p)[4] = a; //
int (*p2)[6] = a; //windows , int (*)[6] int (*)[4]
printf("
%d",*(*(p1 +1)+2)); // 5
printf("
%d",*(*(p +1)+2)); // 7
printf("
%d",*(*(p2 +1)+2)); // 9
getchar();
}
現象解釈:int(*p 1)[2]=a;定義するのは1つの指向列数が2の配列であり、下付きの移動時に配列a[3][4]をaとする[6[2]int(*p 1)[6]=a;定義されているのは、列数2を指す配列であり、下付きの移動時には配列a[3][4]をaとする[2][6]
--------関数scanf()用法補足:
前回のブログでは、関数scanf()は、スペース、インデント、リターンを受け入れず、遭遇すれば入力が終了すると書いてありました.しかし、連続入力時にどのように間隔を置くかというと、scanf(「%d,%d,%d,%d」,&a,&b,&c)この場合カンマ間隔scanf(「%d%d%%d」,&a,&b,&c)を使用できます.この場合、リターン間隔scanf(「%d%d%%d」,&a,&b,&c)を使用できます.