Как компилятор в C может получить разницу между адресом первого элемента массива и адресом всего массива? - PullRequest
2 голосов
/ 24 марта 2020

Учитывая эту проблему, и я полностью осведомлен о фактах:

1) Имя массива является фиксированным указателем на его первый элемент.

2) имя двумерной матрицы - это адрес ее первого одномерного массива.

3) и разница между x [i] и & x [i] в ​​арифметических c операциях (где i неотрицательный целое число).

Компилятор MinGW. Как компилятор в C может получить разницу между адресом первого элемента массива и адресом всего массива, хотя они содержат одну и ту же цифру c ценность ?

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(void)
{
    int x[3][3] = {1,2,3,4,5,6,7,8,9} ; 
    int *p  ; 
    for(p = &x[0] ; p < &x[0] + 1 ; p++) //Warning: comparison of distinct pointer types in this line of code 
        printf("%d\n",*p) ; 

    return 0 ; 
}

1 Ответ

3 голосов
/ 24 марта 2020

Вы назначаете / сравниваете два разных типа указателей.

x имеет тип int [3][3], то есть массив размером 3 с массивом размера 3 из int. Оттуда x[0] имеет тип int [3], то есть массив размером 3 int.

Впоследствии &x[0] имеет тип int (*)[3], то есть указатель на массив размером 3 int. Напротив, p имеет тип int *, то есть указатель на int. Это разные типы, поэтому компилятор выдает вам предупреждение.

Компилятор более или менее анализирует выражения, как я описал, рассматривая тип объекта и видя, как тип результирующее выражение изменяется при применении каждого оператора.

...