怒了!谁知道数组和指针的区别

proware 2007-11-03 06:57:17
我知道有很多人问过。。也回答过。。

但被问到的时候。。我的回答是
对于数组。。
在编译的时候,符号表中a..对应一个地址2222...访问数组元素的方式为:
1。取i。将其和2222相加
2.取上面地址的内容。
而对于指针。。
在编译的时候,符号表中p..对应一个地址2222。。访问元素的方式为:
1.取2222中的内容。。。3333。
2.将3333和i相加。。
3.取上面地址的内容。。。

同时,由于在编译时a的值已经定了,所以不能对他进行诸如赋值之类的操作。。


难道这不是主要的区别吗??还有其他的吗??
怎么会被鄙视。。说主要的区别是++p呢???!不要对我说数组名不能++这个问题啊。

有人说是++p;

++p这个语句会有什么错误。。。。随便回答。。
...全文
1580 83 打赏 收藏 转发到动态 举报
写回复
用AI写文章
83 条回复
切换为时间正序
请发表友善的回复…
发表回复
thecorr 2007-11-09
  • 打赏
  • 举报
回复
学习了。。
mikster 2007-11-09
  • 打赏
  • 举报
回复
指针是数组他爹.
lxl365 2007-11-09
  • 打赏
  • 举报
回复
数组是指针常量,至于说鄙视你恐怕是自我感觉
asmst 2007-11-09
  • 打赏
  • 举报
回复
数组名是常量指针,而定义的指针是一般变量,
我觉得就是这点区别。
My_Love 2007-11-06
  • 打赏
  • 举报
回复


    char *s1="abcd"; char s2[5]="abcd";




说实在的,没有任何区别。
======================================
区别大了去了!
s1占RAM4字节"abcd"占const5字节
s2占RAM5字节
Soli 2007-11-06
  • 打赏
  • 举报
回复

数组是什么?指针是什么?相信C标准中没有拿出几千字来解释它们的概念(虽然我没有深入研究过C标准)。同样,数组名和指针的区别,C标准中也没有具体讨论并一条条列出来吧,更别说指出哪些是主要的,哪些是次要的。大体浏览了一下C标准,它好像只是说了数组能做什么不能做什么,指针能做什么不能做什么,亦即从外延上对它们做了诠释。

通过上面的讨论,相信大家都知道了“数组能做什么不能做什么,指针能做什么不能做什么”,再做到会使用它们就行了。当然,不是说这个讨论没意义,至少对我来说,让我知道了数组和指针的所能和所不能。但没必要非得分出个1、2、3条的区别来。

我觉得,楼主的问题其实不在这个问题本身(可以看出来,楼主已经对数组和指针理解的非常透彻了),而在于面试技巧。

应试者回答完面试官的问题后,可以当面询问面试官是不是满意,如果不满意面试官肯定会提示你需要对这个问题的某一方面再深入回答以下。那就回答呗。直到面试官满意。错误的做法就是,面试官问一个问题,面试者回答一个,回答完就拉倒。比如楼主,既然面试官说区别在于++p(其实是不是主要区别无所谓,面试官所谓的“主要”可能只是表示他关心的是这方面),那么就应该请教他他指的究竟是什么意思,他说完了,你再解释为什么开始的时候自己的回答没提到这个。这样面试官就不会鄙视你了(以你对问题的理解)。

还有,(这句话不一定对)面试的时候没必要那么较真,顺着面试官的意思说就行,不一定非得说对的。^-^

tanmeining 2007-11-06
  • 打赏
  • 举报
回复
关于楼主所说的这个问题,我来发表点个人的看法:

首先:数组用下标去取值,是直接取的地址内的内容.而指针用下标去取指,取出的首先是个地址,这个地址内的内容才是我们所真正想要取得的值.

那么现在问题就出现了,楼主所遇到的,是直接对内存地址进行操作,所以关于类型匹不匹配的问题在此是透明的,因此就有了以下的东西


我将一个char a[3] = { 0x7, 0x56, 0x89 };

那么其在内存中的存放就是d,s,a,\0,占四个内存单元,

然后将此数组的首地址赋值给一个int指针,即将p = &a[0];

那么p是一个指针,指针在内存中的访问方式为,32位机器中为4个字节访问,64位机器中位8字节访问,也就是说p++,或者p+1,都极有可能访问不到你所想要的结果.当然这只是理论上的哈,在编译器中会报类型不匹配的错误,但就语言本身来说,这是可以访问的,我曾经也遇到过这样的题(好象是华为的面试题),题目具体什么样子不记得了,反正就是12个char型的数组,里面存放的地址,然后用一个int的指针去访问,主要考查的是面试者对指针在内存中访问的理解...

所以,这题是有目的的,楼主虽然答对了,但不是此题的真正考意,因此也就不必再怒了吧,心平气和才能通达天下...
axecm 2007-11-06
  • 打赏
  • 举报
回复
强烈建议去看看《C专家编程》
zsdhust 2007-11-06
  • 打赏
  • 举报
回复
mark
wjlsmail 2007-11-06
  • 打赏
  • 举报
回复
数组名是一个地址常量、符号常量;
指针是一个地址变量。
raptormk16 2007-11-06
  • 打赏
  • 举报
回复
下面的人都开始没耐心看上面的回帖了
yashiro_ 2007-11-06
  • 打赏
  • 举报
回复
学习~~
糊里糊涂 2007-11-06
  • 打赏
  • 举报
回复
说实在的区别是和大的,++p如果对数组应该会出错,因为它改变了数组本身地址的值,这是不行的,指针就没有问题。
糊里糊涂 2007-11-06
  • 打赏
  • 举报
回复
你可以参考林锐博士的《高质量C++/C编程指南》中关于数组和指针的区别:数组要么在静态区创建,要么在栈上创建。数组名(而不是指针)对应着一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变
指针可以随时指向任意类型的内存块,它的特征是可变的,所以常用指针来操作动态内存。指针远比数组灵活,但也更危险。
所以我觉得指针与数组的区别应该从1:只想的内存空间,当然指针也可以指向静态存储区,如常量指针。2:数组本身的特征,如其地址不可变,而指针可变等3:指针更灵活,但也更危险,需要更多的人为管理。
xzcanle 2007-11-06
  • 打赏
  • 举报
回复
数组名就是地址,我记得老师是这样讲的我也是这样用的。
有些东西只能意会不能言传。。。。。。。
zhoujianhei 2007-11-06
  • 打赏
  • 举报
回复
char *s1="abcd";    char s2[5]="abcd";


说实在的,没有任何区别。
yufuwan 2007-11-06
  • 打赏
  • 举报
回复
NND,楼主也失去耐心了,都太能扯了,全是人才啊~~~~~~~~~~~~~~~
hertcloud 2007-11-06
  • 打赏
  • 举报
回复
一个是种 数据结构 的内部实现
一个只是内存中的地址 变量罢了.

个人理解诶
天亮后说晚安 2007-11-06
  • 打赏
  • 举报
回复

int a[] = {12};
a 是常量指针,而
int *p = new int[3];
p 是一般的指针。
makewater 2007-11-06
  • 打赏
  • 举报
回复
只看了一下楼主的回答 , 个人感觉被b4也不奇怪! 
首先说的太模糊,完全就不书面话,这样可以看出你的表达能力不行。
具体关于内容上,不发表评论 ^_^
加载更多回复(61)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧