令人震惊的事实:数组和指针并不相同
文件1:
int my_array[5];
文件2:
extern int * my_array;
这样的程序能不能运行呢?肯定是不能运行的
这里文件1定义了一个数组my_array,但文件2申明它为指针。这有什么错误吗?,无论如何,“每个人都知道”在C语言中,数组和指针非常相似。问题 在于“每个人”这种说法是错误的。
定义和申明的区别:
定义:只能出现在一个地方,确定对象的类型并分配内存,用于创建新的对象。例如:int my_array[5];
申明:可以出现多次,描述对象的类型,用于指代其他地方定义的对象。例如:entern int my_array[];
extern对象申明告诉编译器对象的类型和名字,对象的内存分配则在别处进行。由于并未在申明中为数组分配内存,所以并不需要提供关于数组长度的信息。
数组名与指针
#include<stdio.h>
int main(int argc, char *argv[])
{
int a[5] = {1, 2, 3, 4, 5};
int *p = (int *)(&a + 1);
printf("%p %p %p %p\r\n", &a, a, &a[0], p - 5);
printf("%p %p %p %p\r\n", &a + 1, a + 1, &a[0] + 1, p);
printf("%d %d\r\n", *(a + 1), *(p - 1));
return 0;
}
/**输出结果
0028FEF8 0028FEF8 0028FEF8 0028FEF8
0028FF0C 0028FEFC 0028FEFC 0028FF0C
2 5
*/
#include<stdio.h>
int main(int argc, char *argv[])
{
int a[5] = {1, 2, 3, 4, 5};
int *p = &a;
int *q = a;
printf("%p %p %p %p\r\n", &a, a, &a[0], p);
printf("%p %p %p %p\r\n", &a + 1, a + 1, &a[0] + 1, p + 1);
printf("%d %d\r\n", *(q + 1), *(p + 1));
return 0;
}
/**输出结果
0028FEF4 0028FEF4 0028FEF4 0028FEF4
0028FF08 0028FEF8 0028FEF8 0028FEF8
2 2
*/
#include <stdio.h>
int main(int argc, char **argv)
{
int a[10];
printf("---------------- \r\n");
printf("%p \r\n", a);
printf("%p \r\n", &a);
printf("%p \r\n", &a[0]);
printf("---------------- \r\n");
printf("%p \r\n", a + 1);
printf("%p \r\n", &a[1]);
printf("%p \r\n", &a + 1);
printf("%p \r\n", &a[10]);
printf("---------------- \r\n");
return 1;
}
/** 输出结果
----------------
0x7fffed2ddb50
0x7fffed2ddb50
0x7fffed2ddb50
----------------
0x7fffed2ddb54
0x7fffed2ddb54
0x7fffed2ddb78
0x7fffed2ddb78
----------------
*/
/************************** end of fiel **************************/