第九章
再论数组
很重要,所以记得就相对多点。
声明本身可以进一步分成3种情况:
。外部数组的声明
。数组的定义(定义是声明的一种特殊形式,他分配内存,并提供一个初始值)
。函数的参数声明
所以作为函数参数的数组名都是可以通过编译器转换为指针的。
软件信条
什么时候数组和指针是相同的?
c语言标准对此做了如下说明:
规则 1,表达式中的数组名(于声明不同)被编译器当作一个指向该数组第一个元素的指针
规则2,下标总是于指针的偏移量相同
规则3,在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针
简而言之,数组和指针的关系颇有词和诗的关系:都是文学形式,有不少共同处,但是在实际的表现手法上又各有特色。
当然存在特殊的情况不能够相等
。数组作为sizeof函数的操作数,显然此时是整个数组的大小,而不是指针的大小。
。使用&操作符取数组的地址
。数组是一个字符串常量初始值(显然,之所以这样是第四章所说的原因,当时指针是,字符串的值是不能够改变的)
规则一:”表达式中的数组名“就是指针
只需记住:在表达式中指针和数组是可以互换的,因为他们在编译器中是一样的。最终的形式都是指针。
规则二:c语言把数组下标作为指针的偏移值
有一种说法,在编写数组算法时,使用指针比使用数组“更有效率”
这种说法是错误的,c语言把数组下标改写为指针偏移量的根本原因是底层硬件所使用的基本模型。
规则三:“作为函数参数的数组名”等于指针
为什么c语言把数组形参当作是指针?
是出于效率的考虑。
在c语言中,所有的非数组形式的数据实参均以传值形式(对实参作一份拷贝并传递给调用函数,函数不能够修改作为实参的实际变量的值,
而只能修改传递给它的那份拷贝的值)
注意:有一样操作只能在指针里进行而无法在数组中完成,就是修改他的值,数组名是不可修改的左值,它的值是不能够修改的。
数组和指针可交换性的总结
1,用a[i]这样的形式对数组进行访问总是被编译器“改写”或解释为像*(a+1)这样的形式的指针访问
2,指针就是指针,绝对不可以改写为数组。你可以用下标形式访问指针,一般都是作为函数时,而且你知道实际传递给函数的是一个数组。
3,在特定的上下文中,也就是他作为函数的参数(也只有这种情况),一个数组的声明可以看作是一个指针。
4,因此,将一个数组定义为函数的参数是,无论是定义为数组,或是指针,在函数内部事实上都是获得一个指针。
5,在其他所有的情况中,定义与声明必须匹配。
再罗嗦一次,只有字符串常量才能够初始化指针数组。指针数组不能够由非字符串的类型直接初始化。
问题:
p217页。地址为什么不一样?
阅读(808) | 评论(0) | 转发(0) |