※※※※※※※※※※※※※※※※※※※指针与数组※※※※※※※※※※※※※※※※※※※※※※※※※※※ 12:49 2008-1-25 BY:CHLAWS
数组在内存中的分配并不是以表格形式排列。 单个元素的存储和引用实际上是以线性形式排列在内存中的。
指针数组就是一个lliffe变量。
****************************************************************************************************
数组和指针参数是如何被编译器修改的.
"数组名被改写成一个指针参数"规则并不是递归定义的.数组的数组会被改写为"数组的指针",而不是"指针的指针"
****************************************************************************************************
实 参 所匹配的形式参数
数组的数组 char c[8][10]; char(*)[10]; 数组指针
指针数组 char *c[15]; char **c; 指针的指针
数组指针(行指针) char (*c)[64]; char (*c)[64]; 不改变
指针的指针 char **c; char **c; 不改变
正如上所述, 因此在main()中的参数才能看到 **argv这样的参数,因为*argv[]是指针数组,在编译时会被编译器改写
成一个指向指针的指针.如果argv是一个数组的数组即(char argv[10][15])它将被编译器改写成char (*argv[15]),
而不是 char **argv .
当数组名作为函数参数传递时,实际传递给函数的是一个指向数组第一个元素的指针.
函数所接受的参数实际上是原参数的一份拷贝(副本),所以函数可以对其进行操作而不会影响实际参数.
但是,对指针参数执行间接访问操作允许函数修改原先的数组的元素.
//提炼:即对形参中指针副本的修改不会影响指针参数的本身,但对指针所指向单元的内容的修改会改变实参的内容.