免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4530 | 回复: 19
打印 上一主题 下一主题

[C] C语言中数组与指针,这两者似是非是,到底是何关系? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-18 15:08 |只看该作者 |倒序浏览
C语言中指针与数组,除了指针是变量,可以进行赋值运算,数组地址是常量,不能进行赋值运算外(标号:区别1),还有什么区别?《C程序设计语言第二版》84页中提到,“在计算数组元素a的值时,C语言实际上是先将其转换为*(a+i)的形式,然后再进行求值,因此在程序中这两种形式是等价的”。
int arr[10]={0};
int *ptr;
ptr=arr;

*(arr+0)=0;
*(ptr+0)=10;
arr[1]=1;
ptr[2]=2;
*(ptr+3)=3;
这是不是意味着指针与数组之间除了上面提到的区别1外,其他的是一样的?但是有另外一个问题是(标号:问题1):数组会越界,指针却不会产生越界。这个是怎么回事?

我尝试想在汇编中看看能不能看到一丝端倪,但不知道是不是水平有限,看不出什么。。。贴上来给各位大神帮忙看看,指点下。

源码:


前半部分汇编:


后半部分汇编:


上面的代码是在VC6.0中实现的,各位大神给点指导,指针与数组,到底有什么暧昧关系?
下面罗列下几个疑问:
1.按照上面汇编中的代码看,指针和数组好像没什么区别(当然指针的值可以改变,数组的首地址不能改变了),但是数组会越界,指针却不会产生越界。这个是怎么回事?
2.在前半部分汇编代码中,是用ecx保存数组长度?若是,在后半部分代码代码中ecx的值被改变,那么之后怎么知道数组的长度呢?
3.通过数组下标访问数组元素比通过指针快?

论坛徽章:
0
2 [报告]
发表于 2013-11-18 16:48 |只看该作者
没人么?自己顶一下,不要沉了啊

论坛徽章:
1
丑牛
日期:2013-09-29 19:04:50
3 [报告]
发表于 2013-11-18 16:59 |只看该作者
看汇编代码没用的,要看机器码

论坛徽章:
0
4 [报告]
发表于 2013-11-18 17:02 |只看该作者
回复 3# solu


   

论坛徽章:
0
5 [报告]
发表于 2013-11-18 17:46 |只看该作者
汇编好高端……指针与数组的区别太多了……
简单的理解你可以认为一个是常量一个是变量,另外关于数组、指针越界问题,如果我没记错C是不会对越界进行报错的,就好比你开辟了一个数组a[10];然后你访问a[11],就相当于你访问了那片内存而已,但是你并不知道a[11]是个东西你没法控制,常常会导致一些不可预估的错误;指针也是一样的,这种越界控制都是交给程序员去做的。
另外C里面指针要灵活的多,不单单是数组指针,还有函数指针、结构体指针等等,说一切皆指针都不为过……
还有一个区别就是数组是开在栈里面的,内存的释放是由系统去控制,大部分编译器生命周期就是一个大括号{},指针通常用于开辟空间,malloc/new之类,但是必须手动释放空间,不然会内存泄漏。
别纠结汇编,没啥用,多敲点代码就懂了。

论坛徽章:
0
6 [报告]
发表于 2013-11-18 17:51 |只看该作者
补充一下,全局变量除外。

论坛徽章:
0
7 [报告]
发表于 2013-11-18 21:41 |只看该作者
回复 6# luciker1988
谢谢

   

论坛徽章:
0
8 [报告]
发表于 2013-11-18 22:03 来自手机 |只看该作者
本帖最后由 syre 于 2013-11-18 22:05 编辑

ecx并不保存长度,而是后面rep的重复次数,那行是用来初始化内存为0xCCCCCCCC的。

数组和指针实现上是一回事,但是下标访问和指针运算却不是一回事。指针运算本身是个表达式,编译以后自然会多点。不过也没准开编译优化以后就一样了。

论坛徽章:
0
9 [报告]
发表于 2013-11-18 22:05 |只看该作者
ecx并不保存长度,而是后面rep的重复次数,那行是用来初始化内存为0xCCCCCCCC的。

数组和指针实现上是一回事,但是下标访问和指针运算却不是一回事。指针运算本身是个表达式,编译以后自然会多点。不过也没准开编译优化以后就一样了。

论坛徽章:
0
10 [报告]
发表于 2013-11-18 22:05 |只看该作者
ecx并不保存长度,而是后面rep的重复次数,那行是用来初始化内存为0xCCCCCCCC的。

数组和指针实现上是一回事,但是下标访问和指针运算却不是一回事。指针运算本身是个表达式,编译以后自然会多点。不过也没准开编译优化以后就一样了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP