在c中数组等于指针么?
对这个问题很多人可能认同,最近重温了一些书籍,在此做个总结。
1. 声明与定义
首先需要确定两个概念:声明与定义。
定义是一种特殊的声明,它创建了一个对象;声明简单的说明了在其他地方创建的对象的名字,它允许你使用这个名字。c中的定义有且仅有一个,但它可以有多个extern声明。区分定义与声明:
声明:它所说明的并非自身,而是描述其他地方创建的对象。
定义:特殊的声明,它为对象分配内存。
2. 数组
char str[9]="abcdefgh";
c = str[i];
编译器符号表具有一个地址(str):9980
step 1:取i的值,将它与9980相加
step 2:取地址(9980+i)的内容
3.指针
char *p_str ="abcdefgh";
c = p_str[i];
编译器符号表具有一个p_str,地址为4624,即&p_str=4624
step 1:取地址4624的内容,即‘5801’
step 2:取i的值,并与5801相加
step 3:取地址[5801+i]的内容
因此,从上面看,str[3]='d' and p_str[3]='d',但它们获取的途径并不一致。
4.在什么情况下,数组与指针相同,什么情况下不同
相同:在同文件的表达式中相同
作为函数的参数可以通用
不同:声明时,如extern char a[],不能改写为extern char a;
定义时,如char a[10]; 不能改写为指针的形式
5.数组与指针可交换行总结(参考c专家编程)
1).用a[i]这样的形式对数组访问总是被编译器“改写”为像*(a+i)这样的指针访问
2).指针始终是指针,它绝对不可能改写成数组,你可以用下标的形式访问指针,一般都是指针作为函数参数时,而且你知道实际传递给函数的是一个数组。
3).在特定的上下文中,也就是它作为函数的参数时(也只有这样情况),一个数组的声明可以看做时一个指针。作为函数参数的数组(就是在一个函数调用中)始终会被编译器修改成为指向数组第一个元素的指针。
4).因此,当把一个数组定义为函数的参数时,可以选择把它定义为数组,也可以定义为指针。不管选择哪种方法,在函数内部事实上获得的都是一个指针。
5).在其他所有情况中,定义和声明必须匹配。如果定义了一个数组,在其他文件对他进行声明时也必须把它声明为数组,指针也是如此。
在特定的上下文中,也就是它作为函数的参数时(也只有这样情况),一个数组的声明可以看做时一个指针。作为函数参数的数组(就是在一个函数调用中)始终会被编译器修改成为指向数组第一个元素的指针。