Учитывая `int num [7]`, как `num `,` & num [0] `,` & num` отличаются?

Я читал в книге C, что для массива num [7] термин num эквивалентен & num [0] ]. Эта концепция работала у меня нормально, но когда я написал эту программу, показанную ниже, я снова запутался.

#include<stdio.h>
#include<conio.h>
int main()
{
    int num[]={21,22,23,24,25,26,27};
    int *x,*y,*z;
    x=&num;
    y=num;
    z=&num[0];
    printf("%d   %d   %d\n",sizeof(x),sizeof(y),sizeof(z));
    printf("%d  %d  %d\n",sizeof(&num),sizeof(num),sizeof(&num[0]));
    printf("%d   %d   %d",*(&num),*(num),*(&num[0]));
    getch();
    return 0;  
}

вывод:

      4    4    4
      4    28   4
      2293536   21   21

Если num идентичен & num [0] тогда почему разница в их размерах? И что это за третий тип термина & num ? Я знаю, что он показывает значение мусора, но имеет ли смысл этот тип термина? z = & num [0] Я уже понял. Компилятор показывает предупреждение для присваивания x = & num , но для y = num; у компилятора нет никаких проблем. Если num имеет размер 28 , то почему он был назначен целочисленному указателю y без приведения типа?

Затем я попробовал на 2-мерном массиве это путь:

#include<stdio.h>
#include<conio.h>
int main ()
{
    int s[4][2]={{1234,56},{1235,57},{1236,58},{1237,59}};
    int i
    printf ("\n%d %d %d %d %d",sizeof(s[i]),sizeof(&s[i]),sizeof(s),
        sizeof(s[0][0]),sizeof(&s));
    getch();
    return 0;
}

Теперь вывод

8  4  32  4   4

Здесь sizeof (s [i]) равен 8 . потому что s [i] является одномерным массивом и имеет два элемента, так что все в порядке. Но я понятия не имею, что означают термины & s [i] и & s . И я снова могу видеть, что s не идентично s [0] [0] . Я использовал версию Dev C ++ 4.9.9.2 для запуска всех программ. Я хочу прояснить эти три типа терминов.

11
задан Null 9 July 2015 в 16:25
поделиться