#include <stdio.h>
int main()
{
char str[3][15] = {"Pointer to","char","program"};
char (*pt)[15] = str; // statement A
char *p = (char *)str; // statement B
printf("%s\n",p[3]); // statement C - Seg Fault in this line
printf("%s\n",p); // working properly displaying "Pointer to"
printf("%s\n",p+1); // here it is pointing to second element of first array so displaying "ointer to"
printf("%s\n",pt+1); // printing properly "char" as expected
int num[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*nm)[3] = num[1];
int *n = num;
printf("n - %d\n",n[10]); // statement D
printf("nm - %d\n",nm[0][0]);
return 0;
}
私の質問:
char配列とint配列の場合のデータ格納メカニズムについて明確なアイデアを得るのを手伝ってください
上記のプログラムでは、ステートメント A に示すように char 配列へのポインターが char の 2D 配列を指している場合、正しく表示されますが、通常の char ポインターによって指され、ステートメント C で char を出力しようとすると、SegFault が発生することを理解しています。代わりに、「n」(最初の配列「ポインターへのポインター」の 3 番目の数字の文字) を出力する必要があるため、int 配列の場合、ステートメント D で適切な要素 n = 11 を取得している理由と、この場合 (ステートメント C) である理由が混乱しています。正しく印刷されません。
char配列の場合のデータの格納方法は、以下に示すこの形式で格納されます
char str[3][15] = {{'P','o','i','n','t','e','r',' ','t','o'},
{'c','h','a','r'},
{'p','r','o','g','r','a','m'}};
このように格納されている場合、ステートメント D に示されている整数ポインターの配列のように機能するはずです。