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