C语言中的数组和指针是躲避不开的两个重要的概念;而且两者有有相近的地方,这里主要说说他们不同的地方。
- 指针和数组在读取数据的方式不同:
定义一个数组:
char p[9]="abcdefgh";
如果要获取p[3]的值,数组是如何获取的呢?
1、编译器在编译的时候就会为a分配一个初始地址,如0x1001,这个地址下面的值是字符a;
2、在0x1001的基础上加上3地址就变成了0x1004,这个地址下面存储就是字符d.
定义一个指针:
char* p="abcdefgh";
同样如果要获取p[3]的值,指针是如何获取的呢?
1、p的地址是0x2001,它指向的内容是0x3001,也就是一个地址,存着字符a;
2、在0x3001的基础上加上3变成0x3004,地址0x3004中的内容就是字符d;
通过以上可以看到:指针中存储的是地址,数组中存储的是内容。
- 定义一个数组,但是声明一个指针引用
char p[9]="abcdefgh";
在另一个文件中声明:
extern char* p;
printf("p[3]=%c\n",p[3]);
运行时却出现了崩溃。
因为既然声明的p是一个指针,那么p读取数据的方式就是应该按照指针的读取方式来的。
要读取p[3]中的内容,p[3]的内存应该是实际读取的内容,但是却被看成一个地址,然后在去读取这个地址中内容,所以才会出现崩溃。
修改成一下这样就可以了:
extern char p[];//加不加数字9都可以
printf("p[3]=%c\n",p[3]);
注意:
指针保存的是地址
数组保存的是数据
但是作为函数形式参数,指针和数组是一样的!