1、数组和指针相同与否的情况:
extern,如externchar a[ ];不能改写成指针的形式
声明: 定义,如 char a[10];不能改写成指针的形式
函数的参数,如 func(char a[ ]);可以改成数组或指针的形式
数组:
在表达式中使用: 如 c = a[i]; 可以改成数组或指针的形式
然而,数组和指针在编译器处理时是不同的,在运行时的表示形式也是不一样的,并可能产生不同的代码。对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。
2、什么时候数组和指针是相同的:
规则1:“表达式中的数组名“就是指针。
在表达式中,指针和数组是可以互换的,因为它们在编译器里的最终形式都是指针,并且都可以进行取下标操作。(a[3]等于 3[a] )
规则2:C语言把数组下标作为指针的偏移量。
不论时指针还是数组,在连续的内存地址上移动时,编译器都必须计算每次前进的步长。
规则3:“作为函数参数的数组名”等同于指针。
在函数形参定义这个特殊的情况下,编译器必须把数组形式改写成指向数组第一个元素的指针形式。编译器只向函数传递数组的地址,而不是整个数组的拷贝。下面三种形式是完全等同的:
my_function(int *turnip) {…….}
my_function(int turnip[]) {……..}
my_function(int turnip[200]) {……..}
3、所有属于函数实参的数组在编译时被编译器改写为指针。因此,在函数内部对数组参数的任何引用都将产生一个对指针的引用。
4、数组和指针的可交换性:
1)当把一 个数组定义为函数的参数时,可以选择把它定义为数组,也可以定义指针。不管选择哪种情况,在函数内部事实上获得的都是一个指针。
2)如果定义了一个数组,在其他文件对它进行声明时也必须把它声明为数组,指针也是如此。
5、二维数组的初始化:
1)数组里存放字符串常量:(指针数组)
char *vegetables[] = { "carrot",
"celery",
"corn",
"cilantro" };
2)数组里存放非字符串类型:
int row_1[ ] = {1,2,3,4,5,-1}; /*-1是行结束标志*/
int row_2[ ] = {6,7,-1};
int row_3[ ] = {8,9,10,-1};
int *weight[ ] = {
row_1,
row_2,
row_3
};
6、数组名:
数组作为形参传入函数中时,编译器会将数组看成指针,对数组名取址就是对指针取址,和数组名的地址不一样。但是在主函数中,对数组名取址和数组名的地址是一样的。因为数组名是不可修改的左值。