易截截图软件、单文件、免安装、纯绿色、仅160KB

C/C++数组名与指针区别深层探索

C/C++数组名与指针区别深层探索
 
作者:宋宝华 e-mail:21cnbao_AT_21cn.com [AT -> @]
1. 引言
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多
程序设计者就被搞糊涂了。而许多的大学老师,他们在C 语言的教学过程中也错误得给学生讲解:“数组名就是指针”。
很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的
程序员,他们保留着“数组名就是指针”的误解。
2. 魔幻数组名
请看程序(本文程序在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. }
2.1 数组名不是指针
我们先来推翻“数组名就是2.1 数组名不是指针
我们先来推翻“数组名就是指针”的说法,用反证法。
证明 数组名不是指针
假设:数组名是指针;
则:pStr 和str 都是指针;
因为:在WIN32 平台下,指针长度为4;
所以:第6 行和第7 行的输出都应该为4;
实际情况是:第6 行输出10,第7 行输出4;
所以:假设不成立,数组名不是指针
2.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
数组名再一次显得像指针!
既然数组名不是指针,而为什么到处都把数组名当指针用?于是乎,许多程序员得出这样的结论:数组名(主)是(谓)
不是指针的指针(宾)。


相关文档:

【C\C++语言入门篇】 序言

之前的定位可能主要为了研究底层及一些较复杂的问题上,而忽略了一些初学的朋友。导致他们可能一进来就有点“望而生畏”的感觉(自诩了哈,拍砖!)。应怪兽群里兄弟及一些朋友的建议,同时也为了把自己的经验及编程方面的一些想法分享给大家。因此打算写一些CC++语言基础入门的博文。
从本模块中,大家可以了解 ......

Decrease the size of C:\Windows\Installer

http://social.msdn.microsoft.com/Forums/en/sqltools/thread/07db294a-79e5-4a5a-916c-6a51e44a5aa4
http://www.pcreview.co.uk/forums/thread-211705.php
Download "MsiZap.exe" from http://support.microsoft.com/default.aspx?scid=kb;en-us;290301 ......

Pro*C 并发数据库连接、建立数据库链

/*
 *  该功能主要是演示,同时连接两个并发的数据库
 */
/* 包含C头文件 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 包含SQLCA头文件 */
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE sqlda;
int main()
{
    EXEC SQL BEGIN DE ......

【C\C++语言入门篇】 HelloWorld思考

第一篇文章终于落笔了,本文将从思考的角度去重新认识一下Helloworld。在例子之后会提出不同的问题,引导大家去思考每一句乃至每个细节。同时希望能够让大家以后能够以不断思考不断提问的方式去看待自己的程序。我相信大家会发现很多新的东西,好了切入正题。
我们每学一种新的语言基本都会从helloworld开始,基本每种语言 ......

自己动手用 C 扩展 PHP

[ZT]自己动手用 C 扩展 PHP
引言:
   有感于大多数人认为 PHP 只是一种弱类型,只能做小型web应用的脚本语言。 与目前的Java, .Net平台有一定的差距,所以决定写一些 PHP 的扩展方法文章,我相信
我们PHPER们通过自己动手写商业扩展,一定能构建出强大的,极速的Web应用,因为扩展本身就是编译型语言编写的(c ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号