#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;
}
Мои вопросы:В чем разница между указателем на 2D-массив и указателем на 2D-массив?
Пожалуйста, помогите мне, чтобы получить четкое представление о данных, хранящих механизм в случае массив символов и целочисленный массив
В приведенной выше программе я понять, что, когда указатель для массива char указывается на двумерный массив символов, как показано в инструкции A, отображается , отображая его правильно, но когда он указывается нормальным указателем char и пытается распечатать символ в выражении C, он получает Se gFault, вместо этого он должен печатать 'n' (символ третьего числа в первом массиве «Pointer to»), так что с путаницей, почему в случае массива int я получаю надлежащее значение элемент n = 11 в инструкции D и почему в этом случае (оператор C) неправильно печатается.
Как данные будут храниться в случае массив символов он будет сохранен в этой форме, показанной ниже
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 . Пожалуйста, помогите мне в руководстве по этой проблеме и проясните вопрос, который у меня есть в случае хранения массивов символов и массивов.
'char str [3] [15] = {{'P', 'o', 'i', 'n', 't', 'e', 'r', '', 't', ' 'o', '\ 0'}, {'c', 'h', 'a', 'r', '\ 0'}, {'p', 'r', 'o', 'g ',' r ',' a ',' m ',' \ 0 '}}; ' – LPs
оператор D работает, потому что' num' получает выделение в виде единого массива, который компилятор обращается по следующей формуле: с учетом выражения ' num [row] [col] ', то это то же самое, что' * ((int *) num + row * 4 + col) '. – miravalls
'printf ("% s \ n ", p [3]);' -> 'printf ("% s \ n ", &p[3]);' – LPs