数组和指针的区别和联系;
在下面这段代码中:
#include <stdio.h>
void main()
{
int ar[10] = {0,1,2,3};
int *p1 = ar;
int *p2 = &ar[0];
printf("%d %d %d %d %d\n",*(p1+1),*(ar+1),ar[1],1[ar],p1[1]);
}
运行结果:
1 1 1 1 1
这四种写法都指向了数组中的第二个元素;
数组名和指针在这种情况下是可以混用的;ar[1]、p1[1]两者是等价的。
C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。
数组就是一个指针,指针也可以像数组那样用使用中括号的方式来进行内存访问。
一个数组名就代表一个数组对象,这个对象内可以有一个或多个元素,每个元素类型都相同;数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。
不能对数组名进行直接复制与比较。若想把数组a的内容复制给数组b,不能用语句 b = a ,否则将产生编译错误。应该用标准库函数strcpy进行复制。同理,比较b和a的内容是否相同,不能用if(b==a) 来判断,应该用标准库函数strcmp进行比较。
语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。要想复制a的内容,可以先用库函数malloc为p申请一块容量为strlen(a)+1个字符的内存,再用strcpy进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数strcmp来比较。