您的位置:首页 > 其它

论c中数组与指针

2016-02-21 19:44 197 查看
在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).在其他所有情况中,定义和声明必须匹配。如果定义了一个数组,在其他文件对他进行声明时也必须把它声明为数组,指针也是如此。

在特定的上下文中,也就是它作为函数的参数时(也只有这样情况),一个数组的声明可以看做时一个指针。作为函数参数的数组(就是在一个函数调用中)始终会被编译器修改成为指向数组第一个元素的指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: