易截截图软件、单文件、免安装、纯绿色、仅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写的3D迷宫

          Boss说,要看OpenGL,看了快一个月,总算出了个像样的东西,用C写了个3D迷宫,
虽然只有350行
       代码,不过边学边写,足足写了一周时间,还是小有成就感的,活活活!
         &n ......

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

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

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++创建html文件

其实就是创建普通文件, CreateFile() 和WriteFile. 然后用ShellExcuteEx()来打开就行了(会自动调用IE).
HANDLE handle;
handle=CreateFile(L"\\windows\\google.html",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE!= handle )
{
DWORD Num;
::WriteF ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号