数组有两种创建方式,一种是在全局静态存储区创建(全局数组),一种是在栈上创建;
(1)数组名对应的是一块内存而不是指向,地址和容量不允许改变,只允许改变内存里的内容;
指针可以指向任意类型的内存块,它是可变的,常用指针操作动态内存
接下来以字符串为例来说明两者的区别
(2)大小不同
char str1[] = "hello";大小为6个字节,表示存放6个字符的字符数组
char *str2 = "hello":大小为4个字节,表示一个指针指向一个只读字符串常量区
(3)数组内容可改 指针内容不可改
str1[0] = 'a';// OK 用下标访问改变对应位置的字符值
str2[0] = 'a';//ERROR 不可改 指针指向的是一个的只读区域,不允许修改
(4)内容复制含义不同
char str3[] = new char[6];
strcpy(str3,str2);//表示有两块内存空间都保存了hello,str3或者str2中任意一个的释放对另一个都不会有影响,因为是两块不同的空间
char *s = p;//表示指针s、p都指向同一个只读区域,一个的释放会影响另一个成为野指针
(5)当数组名作为参数传递时,就退化成为了同类型的指针
(6)数组arr[i]=*(arr+i)是指数组明后偏移i个单元格,然后取值
指针*(p+i) = p[i]表示先把指针的值加i,然后再跳到该地址上取值