数组变量和指针变量有一点小小的区别
所以把数组指针赋值给指针变量的时候千万要小心
加入把数组赋值给指针变量,指针变量只会包含数组的地址信息
而对数组的长度一无所知
相当于指针丢失了一部分信息,我们把这种信息的丢失称为退化
只要把数组当做参数传递给函数,数组免不了退化为指针
但需要记清楚代码中那些地方发生过数组退化
因为他会引起一些不易察觉的错误
举例说明:
char ar[] = "abc";
sizeof(ar) 结果为:6
char *ch = ar;
sizeof(ch) 结果为 8 在32位平台上是4 64位平台是 8
void func(char a[]) {
printf("%lu",sizeof(a));
}
结果为 8 在32位平台上是4 64位平台是 8
举一个好玩的例子
int name[] = {1,4,100};
printf("%i",3[name]);
这个打印结果是100
name[3] == *(name + 3) == *(3 + name) == 3[name]
在对字符串字面量 修改的时候就会报错
char *name = "abc";
name[2] = name[0];
当做这个操作的时候就会报错,原因是"abc" 放在存储区的 常量区,是一个只读的属性,为了实现修改的目的可以这么做
char name[] = "abc";
name[2] = name[0];
这样是 定义了一个字符数组,然后把abc 的值copy 给这个数组,这个数组如果在函数内部,是放到存储器的栈内的
因此在平时的开发中,如果需要一个字符串字面量 应该这么写 当改变这个值的时候,编译器就会给出警告信息
const char *name = "abc";