网站首页
本站精华
免费下载
游客:
注册
|
登录
|
会员
|
搜索
|
帮助
LoveUnix
»
编程开发 & Rational
» c语言中数组名和指针的区别联系
‹‹ 上一主题
|
下一主题 ››
投票
交易
悬赏
活动
打印
|
推荐
|
订阅
|
收藏
标题: c语言中数组名和指针的区别联系
本主题由 蓝色的忧郁 于 2008-6-18 16:24 加入精华
BridgeSoft
LU幼天使
UID 53721
精华
1
积分 21
帖子 32
活跃指数 24
LU金币 155 个
LU金条 0 个
阅读权限 20
注册 2006-9-3
#1
大
中
小
使用道具
发表于 2008-6-2 19:53
资料
个人空间
短消息
加为好友
c语言中数组名和指针的区别联系
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。
想必这种误解的根源在于国内某著名的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者们,能以"深入探索"的思维方式和精益求精的认真态度来对待图书编写工作,但愿市面上多一些融入作者思考结晶的心血之作!
魔幻数组名
请看程序(本文程序在WIN32平台下编译):
1. #include <iostream.h>
2. int main(int argc, char* argv[])
3. {
4. char str[10];
5. char *pStr = str;
6. cout << sizeof(str) << endl;
7. cout << sizeof(pStr) << endl;
8. return 0;
9. }
1、数组名不是指针
我们先来推翻"数组名就是指针"的说法,用反证法。
证明 数组名不是指针
假设:数组名是指针;
则:pStr和str都是指针;
因为:在WIN32平台下,指针长度为4;
所以:第6行和第7行的输出都应该为4;
实际情况是:第6行输出10,第7行输出4;
所以:假设不成立,数组名不是指针
2、数组名神似指针
上面我们已经证明了数组名的确不是指针,但是我们再看看程序的第5行。该行程序将数组名直接赋值给指针,这显得数组名又的确是个指针!
我们还可以发现数组名显得像指针的例子:
1. #include <string.h>
2. #include <iostream.h>
3. int main(int argc, char* argv[])
4. {
5. char str1[10] = "I Love U";
6. char str2[10];
7. strcpy(str2,str1);
8. cout << "string array 1: " << str1 << endl;
9. cout << "string array 2: " << str2 << endl;
10. return 0;
11. }
标准C库函数strcpy的函数原形中能接纳的两个参数都为char型指针,而我们在调用中传给它的却是两个数组名!函数输出:
string array 1: I Love U
string array 2: I Love U
数组名再一次显得像指针!
既然数组名不是指针,而为什么到处都把数组名当指针用?于是乎,许多程序员得出这样的结论:数组名(主)是(谓)不是指针的指针(宾)。
整个一魔鬼。
揭密数组名
现在到揭露数组名本质的时候了,先给出三个结论:
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!
1、数组名指代一种数据结构:数组
现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的char型数组,所以sizeof(str)的结果为这个数据结构占据的内存大小:10字节。
再看:
1. int intArray[10];
2. cout << sizeof(intArray) ;
第2行的输出结果为40(整型数组占据的内存空间大小)。
如果C/C++程序可以这样写:
1. int[10] intArray;
2. cout << sizeof(intArray) ;
我们就都明白了,intArray定义为int[10]这种数据结构的一个实例,可惜啊,C/C++目前并不支持这种定义方式。
2、数组名可作为指针常量
根据结论2,数组名可以转换为指向其指代实体的指针,所以程序1中的第5行数组名直接赋值给指针,程序2第7行直接将数组名作为指针形参都可成立。
下面的程序成立吗?
1. int intArray[10];
2. intArray++;
读者可以编译之,发现编译出错。原因在于,虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。
而指针,不管是指向结构体、数组还是基本数据类型的指针,都不包含原始数据结构的内涵,在WIN32平台下,sizeof操作的结果都是4。
顺便纠正一下许多程序员的另一个误解。许多程序员以为sizeof是一个函数,而实际上,它是一个操作符,不过其使用方式看起来的确太像一个函数了。语句sizeof(int)就可以说明sizeof的确不是一个函数,因为函数接纳形参(一个变量),世界上没有一个C/C++函数接纳一个数据类型(如int)为"形参"。
3、数据名可能失去其数据结构内涵
到这里似乎数组名魔幻问题已经宣告圆满解决,但是平静的湖面上却再次掀起波浪。请看下面一段程序:
1. #include <iostream.h>
2. void arrayTest(char str[])
3. {
4. cout << sizeof(str) << endl;
5. }
6. int main(int argc, char* argv[])
7. {
8. char str1[10] = "I Love U";
9. arrayTest(str1);
10. return 0;
11. }
程序的输出结果为4。不可能吧?
一个可怕的数字,前面已经提到其为指针的长度!
结论1指出,数据名内涵为数组这种数据结构,在arrayTest函数体内,str是数组名,那为什么sizeof的结果却是指针的长度?这是因为:
(1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;
(2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。
以上就是结论4。
结束语
最后,笔者再次表达深深的希望,愿我和我的同道中人能够真正以谨慎的研究态度来认真思考开发中的问题,这样才能在我们中间产生大师级的程序员,顶级的开发书籍。每次拿着美国鬼子的开发书籍,我们不免发出这样的感慨:我们落后太远了。
BridgeSoft
LU幼天使
UID 53721
精华
1
积分 21
帖子 32
活跃指数 24
LU金币 155 个
LU金条 0 个
阅读权限 20
注册 2006-9-3
#2
大
中
小
使用道具
发表于 2008-6-2 19:56
资料
个人空间
短消息
加为好友
很基础,但很多老程序员都说不清楚
蓝色的忧郁
版主
禁止发言
UID 274
精华
10
积分 651
帖子 1128
活跃指数 77
LU金币 2683 个
LU金条 0 个
阅读权限 210
注册 2003-10-1
来自 南京
#3
大
中
小
使用道具
发表于 2008-6-3 12:53
资料
个人空间
短消息
加为好友
基础很重要啊,无论什么新技术都是在最基础的东西上搭建起来的.
关注于c/c++,symbian c++的开发
对UNIX/Linux下的c开发也有兴趣
MSN: lee_vincent83615@hotmail.com
QQ: 3603108
蓝色的忧郁
版主
禁止发言
UID 274
精华
10
积分 651
帖子 1128
活跃指数 77
LU金币 2683 个
LU金条 0 个
阅读权限 210
注册 2003-10-1
来自 南京
#4
大
中
小
使用道具
发表于 2008-6-3 12:54
资料
个人空间
短消息
加为好友
感觉自己的基础很薄弱,最近在补C语言.
不是我说什么,国外写的教材真的要好很多.
关注于c/c++,symbian c++的开发
对UNIX/Linux下的c开发也有兴趣
MSN: lee_vincent83615@hotmail.com
QQ: 3603108
windfive
LU幼天使
UID 61744
精华 0
积分 23
帖子 16
活跃指数 4
LU金币 15 个
LU金条 0 个
阅读权限 20
注册 2006-12-18
#5
大
中
小
使用道具
发表于 2008-7-23 16:05
资料
个人空间
短消息
加为好友
从编译器的角度其实是可以解释的很简单的,问题我们都是用别人的编译器而已。最后那个例子本来就是带了一个char *的参数啊!
cheng_lai_shun
LU新生
UID 109544
精华 0
积分 3
帖子 5
活跃指数 0
LU金币 5 个
LU金条 0 个
阅读权限 10
注册 2008-7-24
#6
大
中
小
使用道具
发表于 2008-7-24 16:50
资料
个人空间
短消息
加为好友
我觉得还是没有说清
可能是没有说清数组这种数据结构吧
[广告]
记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
nana001
LU新生
UID 106100
精华 0
积分 5
帖子 10
活跃指数 1
LU金币 11 个
LU金条 0 个
阅读权限 10
注册 2008-5-4
#7
大
中
小
使用道具
发表于 2008-7-27 09:37
资料
个人空间
短消息
加为好友
学习下
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The Ruby Way ebook free download
Learning Ruby ebook free download
Ruby for Rails ebook free download
Ruby In A Nutshell ebook free download
Ruby Cookbook ebook free download
Ruby on Rails: Up and Running ebook free download
Everyday Scripting with Ruby ebook free download
Ruby Pocket Reference ebook free download
Practical Ruby Gems ebook free download
Beginning Ruby on Rails ebook free download
Ruby on Rails For Dummies ebook free download
The Ruby Programming Language ebook free download
Design Patterns in Ruby ebook free download
The Ruby Way: Solutions and Techniques in Ruby Programming, Second Edition ebook free download
Practical Ruby for System Administration ebook free download
Beginning Ruby From Novice to Professional ebook free download
Ruby by Example Concepts and Code ebook free download
Ruby Developer’s Guide ebook free download
Practical Reporting with Ruby and Rails ebook free download
Mongrel: Serving, Deploying, and Extending Your Ruby Applications ebook free download
Rails Solutions: Ruby on Rails Made Easy ebook free download
Build Your Own Ruby on Rails Web Applications ebook free download
Raven Scripting Java Builds with Ruby ebook free download
Pro Active Record Databases with Ruby and Rails ebook free download
Enterprise Integration with Ruby A Pragmatic Guide ebook free download
Practical Ruby Projects Ideas for the Eclectic Programmer ebook free download
Programming Ruby The Pragmatic Programmers’ Guide ebook free download
Ruby on Rails for PHP and Java Developers ebook free download
Best of Ruby Quiz Volume One ebook free download
Programming Ruby: The Pragmatic Programmer's Guide ebook free download
Game Programming with Python, Lua, and Ruby ebook free download
Beginning Ruby on Rails E-Commerce From Novice to Professional ebook free download
Ruby on Rails Enterprise Application Development: Plan, Program, Extend ebook free download
Practical JRuby on Rails Web 2.0 Projects: Bringing Ruby on Rails to Java Platform ebook free download
[广告]
记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
Amusementer
LU新生
UID 110451
精华 0
积分 1
帖子 2
活跃指数 1
LU金币 3 个
LU金条 0 个
阅读权限 10
注册 2008-8-14
#8
大
中
小
使用道具
发表于 2008-8-14 21:05
资料
个人空间
短消息
加为好友
我觉得还是没有说明白,数组是连续的一段内存,那么数组名有存放的地址么?数组名存放在哪?怎么存在与物理内存中的?
[广告]
记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
kkksaiyid
LU新生
UID 111264
精华 0
积分 4
帖子 7
活跃指数 0
LU金币 7 个
LU金条 0 个
阅读权限 10
注册 2008-9-4
#9
大
中
小
使用道具
发表于 2008-9-14 17:52
资料
个人空间
主页
短消息
加为好友
.
回帖支持下楼主
帅有什么用,碰到卒也要到处躲!!
QQ图标
office2007
繁体字
问道推广人
microsoft office
[广告]
记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
Copy_Mood
LU新生
UID 112060
精华 0
积分 7
帖子 12
活跃指数 1
LU金币 13 个
LU金条 0 个
阅读权限 10
注册 2008-9-25
#10
大
中
小
使用道具
发表于 2008-9-27 19:26
资料
个人空间
短消息
加为好友
我还是一个新手.但还是能看懂..
确实一个很严重的问题,但是我们老师没那么教我, 似乎很欣慰...
投票
交易
悬赏
活动
LoveUnix
专项技术区
> AIX -IBM UNIX
> 其他UNIX & Linux
> i5 (AS400) & IBM大机
> PC Server & HPC
> 存储设备
> 备份软件
> 网络 & 安全
> 编程开发 & Rational
> DB2 & Informix
> ORACLE等数据库
> 中间件技术
行业综合区
> 职业咨询 前程无忧
> 培训认证 行业入门
> 行业应用 项目实施
> 产品信息 商务交流
> Free download下载
交流灌水区
> 蓝色太平洋
> 墨香雅韵
> 论坛建设
> 博客专区
当前时区 GMT+8, 现在时间是 2009-1-9 09:53
乐悠LoveUnix论坛-京ICP备05005823号
Thanks to
Discuz!
© 2001-2007 Power by
LoveUnix.net
Processed in 0.122923 second(s), 7 queries , Gzip enabled
TOP
清除 Cookies
-
联系我们
-
乐悠LoveUnix
-
Archiver
界面风格
----------
Discuz! 5 Default
新DISCUZ风格
控制面板首页
编辑个人资料
积分交易
公众用户组
好友列表
升级个人空间
基本概况
流量统计
客户软件
发帖量记录
论坛排行
主题排行
发帖排行
积分排行
在线时间
管理团队
管理统计