c 数组与指针的使用注意事项
2016-06-14 18:12
274 查看
数组变量和指针变量有一点小小的区别
所以把数组指针赋值给指针变量的时候千万要小心
加入把数组赋值给指针变量,指针变量只会包含数组的地址信息
而对数组的长度一无所知
相当于指针丢失了一部分信息,我们把这种信息的丢失称为退化
只要把数组当做参数传递给函数,数组免不了退化为指针
但需要记清楚代码中那些地方发生过数组退化
因为他会引起一些不易察觉的错误
举例说明:
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 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";
相关文章推荐
- 查看数据库 存储引擎以及默认引擎
- 深入浅出RxJava(二:操作符)
- 前端页面在手机浏览器显示时锚点失效的解决
- 两款响应式的图片轮播插件 rem字体设置
- 【CodeForces】300A - Array(思维)
- kafka单条消息过大导致生产者程序发送到broker失败
- 关注点分离与单一职责
- AjAX(简单概要介绍)
- Tomcat日志配置(草稿)
- 自定义宫格锁
- socket 访问百度
- c++ 类型转换
- jqgrid
- HDOJ/HDU 1022 Train Problem I(模拟栈)
- HDOJ/HDU 1022 Train Problem I(模拟栈)
- C++11模板类使用心得
- 单片机最小系统及其原理图
- 深入浅出RxJava(一:基础篇)
- PAT: 1001. A+B Format (20)
- MFC