荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Version (Who makes history and why), 信区: Program
标  题: 对数组、指针、字符串的理解(或许会有您忽略的东西)
发信站: 荔园晨风BBS站 (Tue Mar 25 18:04:06 2003), 站内信件

对数组、指针、字符串的理解
1、 一维数组
1) 一维数组名可不严格地认为是指针常量:可执行指针的操作,可按地址单元赋值和
引用,也可用来初始化同型的指针变量,但不能对一维数组名赋值。(指针常量)
2) 输出一维数组名,一维数组名的“地址”,结果均是第一个元素的地址。
例:int a[3];
则  cout<<a<<endl;
cout<<&a<<endl;
cout<<&a[0]<<endl;
三句的结果是一样的,与真正的指针(包括指针常量)不同。
2、 二维数组
1) 尽管二维数组名有类似二级指针的运算性质,但不能认为是二级指针,不能用来初
始化同型的二级指针变量。
例:int a[2][3];
则  int **p=a;  //编译错误!不能将int[][]转化为int **,充分证明了不是二级指针

    int **p=(int **)a; //可以通过编译,但p=0x00000001,根本不是想要的地址,一
用程序就崩溃。
2) 输出二维数组名,二维数组名的“地址”,,二维数组名的间接引用,结果均是第
一个“真实”元素的地址。
例:int a[2] [3];
则  cout<<a<<endl;
cout<<&a<<endl;
cout<<*a<<endl;
cout<<a[0]<<endl;
cout<<&a[0]<<endl;
cout<<&a[0][0]<<endl;
六句的结果是一样的,与二级指针不同。
3、 字符串
1) 字符数组:是元素为单个字符的数组,并不要求\0结尾。但与普通数组有大的区别
:可用字符串常量(如“abc”)对其一次性初始化,但要注意字符串常量后有\0,长度
要加1,而且必须是在定义时初始化;不可用字符指针或其它字符数组对其初始化;也可
定义时不初始化,按数组的方法分单元赋值(可越界,且不要求\0结尾);可与字符指
针一样一次性输出,但若不以\0结尾,则后面有乱码,中间有\0则忽略后面的字符。
2) 字符指针:指向字符串的指针,原则上要求\0结尾。可用字符串常量、字符指针或
字符数组对其初始化或赋值。输出字符指针则输整个字符串,但若不以\0结尾,则后面
有乱码,中间有\0则忽略后面的字符。输出*p则为第一个字符。
3) 字符串:以\0结尾的字符数组、字符指针或用双引号括起来的符号串。
4、 指针
1) 指针变量:保存其他变量(或常量)地址值的变量:指针值是一个地址;对其取地
址则为指针变量的地址;取间接引用则为所指变量的内容。指针是有类型的。
2) 指针常量:const直接加在指针名前,表示指针本身是一个常量(即所指地址不变)
,不能作为左值,但可用*修改所指地址单元的内容。必须定义的同时初始化。
例:int a=8;
int * const p=&a;    //p不能变,但*p可变,a跟着变化。必须定义的同时初始化。
   用途:固定某指针只能指向某变量,不做其他用途。
3) 常量指针:cons加在指针类型前,表示指针所指地址单元是一个常量,*p不能作为
左值,但由于p可变,*p自然也在变,只是不能当左值直接赋值而已。可以在定义时初始
化,也可两步。
用途:用在可通过指针引用某变量,但不能修改其值的场合。如strcpy的第二个参数。

例:int a=8;
const int * p=&a;   //p能变,*p自然也在变,只是*p不能当左值,a不会因p而变
4) 指向常量的指针常量:p、*p都不能当左值,必须定义的同时初始化。但指针所指内
容*p能随a变化。
例:const int * const p=&a;  // p、不能变, a不会因p或*p而变,但a本身可变, 因而
*p可变。
<实际上:不管是指针常量、常量指针,还是指向常量的指针常量,*p 总能变!!!>
5) 函数指针:指向函数(非数据区,是代码区)的指针。常用来做参数。
例:数据结构中树遍历 void Traverse(BiTree T, void (*visit) (TelemType e)){}
visit是一个函数指针,使用时可用参数为(TelemType e),返回类型为void的函数的名
字代替。
6) 指针函数:返回指针的函数(不要返回一个局部指针!可返回一个全局、或静态、
化,也可两步。
用途:用在可通过指针引用某变量,但不能修改其值的场合。如strcpy的第二个参数。

例:int a=8;
const int * p=&a;   //p能变,*p自然也在变,只是*p不能当左值,a不会因p而变
4) 指向常量的指针常量:p、*p都不能当左值,必须定义的同时初始化。但指针所指内
容*p能随a变化。
例:const int * const p=&a;  // p、不能变, a不会因p或*p而变,但a本身可变, 因而
*p可变。
<实际上:不管是指针常量、常量指针,还是指向常量的指针常量,*p 总能变!!!>
5) 函数指针:指向函数(非数据区,是代码区)的指针。常用来做参数。
例:数据结构中树遍历 void Traverse(BiTree T, void (*visit) (TelemType e)){}
visit是一个函数指针,使用时可用参数为(TelemType e),返回类型为void的函数的名
字代替。
6) 指针函数:返回指针的函数(不要返回一个局部指针!可返回一个全局、或静态、
或堆中的指针。)
7) 指针与数组:见前面
8) 指针与字符串:见前面


--
                      *
          *                                  *
                          *             *
                      no more to say
                  ★     just wish you   ★
                            good luck

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.50]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店