Я читал в книге 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=#
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 для запуска всех программ.Я хочу быть ясным в этих трех типах терминов.