1:概述
在用C的过程中,恐怕最纠结的就是数组与指针的,有时候可以混用,有时候不可以,真头疼。
2:声明与定义
- 定义:确定对象类型,并分配内存,用于创建新的对象。例: int array[100];
- 声明:描述对象类型,用于指代其他地方定义的对象。例:extern int array[];
声明必须和定义一致。例:
定义:int m[100]; 声明:extern int* m; //Error 数组和指针并不完全相同
定义:int i; 声明:extern float i; //Error 跟上面一个道理
3:左值与右值
- 左值:能够出现在表达式左边的值,通常代表符号所表示的地址,就是存储结果的地方,编译时可知。
- 右值:能够出现在表达式右边的值,通常代表符号地址中的内容,就是要存放的东西,运行时才可知。
4:数组的引用方式
char a[6] = "abcdef"; //假定a的地址是9980
执行c = a[i];的过程
- 编译器取得符号表地址9980
- 取得i的地址,和9980相加
- 取得相加所得结果地址的内容赋值给c
5:指针的引用方式
char *p ; //假定p的地址是4624
执行c = *p;的过程
- 编译器取得符号表的地址4624
- 取得4624地址的内容,假设是5081
- 取得5081地址里面的内容赋值给c
可见数组和指针的引用方式还是存在不同的,指针多里一层间接引用,所以当定义成数组却声明成指针时,将会
安装声明的方式去寻址,请不要报侥幸心理,有时候得到了想要的东西,不过总有一天你会因为这个吃大亏的。
6:数组与指针的区别
指针:
- 保存数据的地址
- 间接访问数据
- 通常用于动态数据结构
- 内存管理malloc 和 free 族
- 通常指向匿名数据
数组:
- 保存数据
- 直接访问数据
- 通常用于存储固定数目而且数据类型相同的元素
- 隐式的分配内存
- 自身就为数据名
数组和指针都可以在定义时用字符串常量进行初始化,但是指针却不为指向的对象分配空间,只为自身分配空间。
当定义的同时用字符串常量进行初始化,但是只有字符串常量才是这样,这就意味着只读。
阅读(1989) | 评论(0) | 转发(1) |