配列ポインタの下付きの使い方、配列ポインタを不正に定義した場合の問題、scanf()の使い方補足

5689 ワード

----------文字列と文字ポインタ
#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;       //windowsint (*)[2] int (*)[4]      
    int (*p)[4] = a;       //      
    int (*p2)[6] = a;     //windowsint (*)[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)を使用できます.