您的位置:首页 > 编程语言

C专家编程:第四章:数组和指针并不相同

2018-03-05 20:53 274 查看
1、声明和定义:
声明相当于普通的声明:它所说明的并非自身,而是描述其他地方的创建的对象。
定义相当于特殊的声明:它为对象分配内存。
例如:定义:int  my_array[100];
    声明:extern int  my_array[ ];指代其他地方定义的对象。(二维数组需要提供除最左边一维之外的其他维的长度)
2、X = Y;
1)符号X是X所代表的地址,符号Y是Y代表的地址的内容;
2)X是左值,Y是右值;
3)左值在编译时可知,左值表示储存结果的地方,右值直到运行时才知,右值表示“Y的内容”。
注:数组名是左值,但不是可修改的左值,标准规定赋值符必须用可修改的左值作为它左边一侧的操作数。
3、当“以指针方式引用”时:
char  *p ="abcdefgh";
当书写了extern  char  *p,然后用 p[3] 来引用其中的元素时,编译器将会:
1)取得符号表中 p 的地址,提取存储于此处的指针。
2)把下标所表示的偏移量与指针相加,产生一个地址。
3)访问上面这个地址,取得字符。
编译器已被告知p 是一个指向字符的指针,(相反,数组定义告诉编译器 p 是一个字符序列)。
既然把p 声明为指针,那么不管p 原先是定义为指针还是数组,都会按照上面的三个步骤进行操作,但是只有当p原来定义为指针时这个方法才是正确的。
4、数组和指针的其他区别:
指针
数组
保存数据的地址
保存数据
间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。
如果指针有一个下标[ I ],就把指针的内容加 I 作为地址,从中提取数据。
直接访问数据,a[ I ] 只是简单的以 a + I为地址取得数据。
通常用于动态数据结构
通常用于存储固定数目且数据类型相同的元素
相关的函数为 malloc(), free().
隐式分配和删除
通常指向匿名数据
自身即为数据名
 
5、数组和指针的定义:
1)定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时给指针一个字符串常量进行初始化,如:
char *p = "breadfruit";  (为字符串常量分配了空间)
只有字符串常量才如此,不会为浮点数之类的常量分配空间,如:
float *pip = 3.141;      //编译出错
在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。
2)有字符串常量初始化的数组是可以修改的,如:
char  a[ ] ="gooseberry";
strncpy(a, "black", 5);
数组的值为“blackberry”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐