Использование типа указателя - PullRequest
0 голосов
/ 30 октября 2019

Я изучаю указатель, и у меня возникли некоторые вопросы по этому поводу.

Тип указателя означает, что размер адреса, сохраняемого в этом указателе, влияет.

Я незнаю, что это правильное выражение.

О 2-мерном массиве,

int A[100][100] = {1,2,3,.....} ;
int* x1 = &A;
int* x2 = &A[0];
int* x3 = &A[0][0];

В этом случае & A, & A [0], & A [0] [0] имеют тот же адрес, норазличный размер этих адресов.

Например, &A++ равен address + 4byte * 100 * 100

&A[0]++ = address + 4byte * 100

Но, x1++, x2++, x3++ все одинаковы. значение об этом выражении. Я знаю, что эта причина вызвана приведением.

Тогда, что i делает для x1++, будет то же выражение, что и &A++?

Ответы [ 3 ]

3 голосов
/ 30 октября 2019

Эти переменные инициализированы неправильно:

int* x1 = &A;
int* x2 = &A[0];

&A не является int * и не является &A[0]. Если вы правильно объявите x1 и x2, при увеличении вы получите желаемое поведение.

int (*x1)[100][100] = &A;
int (*x2)[100] = &A[0];
1 голос
/ 30 октября 2019

Если E является выражением lvalue типа T, то &E является выражением типа "указатель на T" (T *). Помните, что размер массива является частью его типа - int [10] отличается от int [11] или int [9].

Выражение A имеет тип "массив из ста элементов из массива из ста элементов int" (int [100][100]), поэтому выражение &A имеет указатель типа "на 100-элементныймассив из 100 элементов массива int "(int (*)[100][100]), поэтому x1 необходимо объявить как

int (*x1)[100][100] = &A;

Аналогично, выражение A[0] имеет тип" массив из 100 элементов изint "(int [100]), поэтому тип &A[0] имеет указатель типа" указатель на массив из 100 элементов int "(int (*)[100]), поэтому x2 необходимо объявить как

int (*x2)[100] = &A[0];

Таким образом, x1++ будет продвигаться, чтобы указывать на следующий массив элементов 100x100 после A, тогда как x2++ будет продвигаться, чтобы указывать на A[1].

0 голосов
/ 30 октября 2019

Все ваши указатели имеют тип int *. Когда вы увеличиваете их, они будут увеличены на sizeof(int).

Тип указателя означает, что размер адреса, сохраняемого в этом указателе, оказывает влияние. Нет. Тип указателя означает тип объекта, на который указывает данный адрес.

В вашем коде для перехода к следующему элементу необходимо использовать следующую формулу:

x + (number of columns)*(current row) + row

, который в вашем случае был бы для (i, j)

x + 100*i + j
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...