我在C书中读到,对于数组num[7]
,术语num
等于&num[0]
。这个概念对我来说工作得很好,但是当我写下如下所示的程序时,我再次感到困惑。给定`int 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-d阵列是这样的:
#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版本来运行所有的程序。我想在这三类术语中清楚。
阅读有一个专门对这个问题一整节的C FAQ:http://c-faq.com/aryptr/index.html – AnT
@good问题为初学者!好友 – niko