博文
C++入门第6章*6.9 引用 6.9.1 什么是变量的引用(2008-10-12 08:43:00)
摘要:
6.9.1 什么是变量的引用
对一个数据可以使用“引用”(reference),这是C++对C的一个重要扩充,引用是一种新的变量类型,它的作用是为一个变量起一个别名。假如有一个变量a,想给它起一个别名b,可以这样写:
int a; //定义a是整型变量
int &b=a; //声明b是a的引用
以上语句声明了b是a的引用,即b是a的别名。经过这样的声明后,a或b的作用相同,都代表同一变量。
注意: 在上述声明中,&是引用声明符,并不代表地址。不要理解为“把a的值赋给b的地址”。声明变量b为引用类型,并不需要另外开辟内存单元来存放b的值。b和a占内存中的同一个存储单元,它们具有同一地址。声明b是a的引用,可以理解为: 使变量b具有变量a的地址。见图6.26,如果a的值是20,则b的值也是20。
在声明一个引用类型变量时,必须同时使之初始化,即声明它代表哪一个变量。在声明变量b是变量a的引用后,在它们所在函数执行期间,该引用类型变量b始终与其代表的变量a相联系,不能再作为其他变量的引用(别名)。下面的用法不对:
int a1,a2;
int &b=a1;
int &b=a2; //企图使b又变成a2的引用(别名)是不行的
......
C++入门 第6章6.8.2 指针运算小结(2008-10-11 01:32:00)
摘要:
前面已用过一些指针运算(如p++,p+i等),现在把全部的指针运算列出如下。
(1) 指针变量加/减 一个整数
例如: p++,p--,p+i,p-i,p+-i,p-=i等。
C++规定,一个指针变量加/减一个整数是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加或相减。如p+i代表这样的地址计算: p+i*d,d为p所指向的变量单元所占用的字节数。这样才能保证p+i指向p下面的第i个元素。
(2) 指针变量赋值
将一个变量地址赋给一个指针变量。如
p=&a; //将变量a的地址赋给p
p=array; //将数组array首元素的地址赋给p
p=&array[i]; //将数组array第i个元素的地址赋给p
p=max; //max为已定义的函数,将max的入口地址赋给p
p1=p2; //p1和p2都是同类型的指针变量,将p2的值赋给p1
(3) 指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:
p=NULL;
实际上NULL代表整数0,也就是使p指向地址为0的单元。这样可以使指针不指向任何有效的单元。实际上系统已先定义了
NULL: #define NULL 0
在iostream头文件中就包括了以上的NULL定义,NULL是一个符号常量。应注意,p的值等于NULL......
C++入门第6章6.8 有关指针的数据类型和指针运算的小结(2008-10-11 01:29:00)
摘要:
6.8.1 有关指针的数据类型的小结
表6.1 有关指针的数据类型
......
C++入门 第6章例6.16 指向字符型数据的指针变量。(2008-10-11 01:26:00)
摘要:
#include <iostream>
using namespace std;
int main( )
{ char **p; //定义指向字符指针数据的指针变量p
char *name[]={″BASIC″,″FORTRAN″,″C++″,″Pascal″,″COBOL″};
p=name+2; //见图6.23中p的指向
cout<<*p<<endl; //输出name[2]指向的字符串
cout<<**p<<endl; //输出name[2]指向的字符串中的第一个字符
}
运行结果为
C++
C
指针数组的元素也可以不指向字符串,而指向整型数据或单精度型数据等。
在本章开头已经提到了“间接访问”一个变量的方式。利用指针变量访问另一个变量就是“间接访问”。如果在一个指针变量中存放一个目标变量的地址,这就是“单级间址”,见图6.24(a)。指向指针的指针用的是“二级间址”方法。见图6.24(b)。从理论上说,间址方法可以延伸到更多的级,见图6.24(c)。但实际上在程序中很少有超过二级间址的。
......
C++入门 第6章6.7.2 指向指针的指针(2008-10-11 01:25:00)
摘要:
在掌握了指针数组的概念的基础上,下面介绍指向指针数据的指针,简称为指向指针的指针。从图6.22可以看到,name是一个指针数组,它的每一个元素是一个指针型数据(其值为地址),分别指向不同的字符串。数组名name代表该指针数组首元素的地址。name+i是name[i]的地址。由于name[i]的值是地址(即指针),因此name+i就是指向指针型数据的指针。还可以设置一个指针变量p,它指向指针数组的元素(见图6.23)。p就是指向指针型数据的指针变量。
图6.23
怎样定义一个指向指针数据的指针变量呢?如下:
char *(*p);
从附录B可以知道,*运算符的结合性是从右到左,因此“char *(*p);”可写成
char **p;
......
C++入门 第六章 6.7.1 指针数组的概念[续](2008-10-09 09:01:00)
摘要:
print函数的作用是输出各字符串。name[0]~name[4]分别是各字符串的首地址。print函数也可改写为以下形式:
void print(char *name[],int n)
{ int i=0
char *p;
p=name[0];
while(i<n)
{p=*(name+i++);
cout<<p<<endl;
}
}
其中“*(name+i++)”表示先求*(name+i)的值,即name[i](它是一个地址)。将它赋给p,然后i加1。最后输出以p地址开始的字符串。
......
6.7 指针数组和指向指针的指针(2008-10-09 08:59:00)
摘要:
6.7.1 指针数组的概念
如果一个数组,其元素均为指针类型数据,该数组称为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址。一维指针数组的定义形式为
类型名*数组名[数组长度];
例如
int *p[4];
可以用指针数组中各个元素分别指向若干个字符串,使字符串处理更加方便灵活。
例6.15 若干字符串按字母顺序(由小到大)输出。
#include <iostream>
using namespace std;
int main( )
{ void sort(char *name[],int n); //声明函数
void print(char *name[],int n); //声明函数
char *name[]={″BASIC″,″FORTRAN″,″C++″,″Pascal″,″COBOL″}; //定义指针数组
int n=5;
sort(name,n);
print(name,n);
return 0;
}
void sort(char *name[],int n)
{ char *temp;
int i,j,k;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0) k=j;
if(k!=i)
{ temp=name[i];name[i]=name[k];name[k]=temp;}
}
}
void print(char *name[],int n)
{ int i;
for(i=0;i<n;i++)
cout&......
C++入门 第六章 6.6 返回指针值的函数(2008-10-09 08:58:00)
摘要:
一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。返回指针值的函数简称为指针函数。
定义指针函数的一般形式为
类型名 *函数名(参数表列);
例如
int *a(int x,int y);
......
C++入门 第六章6.5.2 用指向函数的指针作函数参数(2008-10-09 08:57:00)
摘要:
在C语言中,函数指针变量常见的用途之一是作为函数的参数,将函数名传给其他函数的形参。这样就可以在调用一个函数的过程中根据给定的不同实参调用不同的函数。
例如,利用这种方法可以编写一个求定积分的通用函数,用它分别求5个函数的定积分:每次需要求定积分的函数是不一样的。可以编写一个求定积分的通用函数integral,它有3个形参: 下限a、上限b,以及指向函数的指针变量fun。函数原型可写为
double integral (double a,double b,double (*fun)(double));
分别编写5个函数f1,f2,f3,f4,f5, 用来求上面5个函数的值。然后先后调用integral函数5次,每次调用时把a,b以及f1,f2,f3,f4,f5之一作为实参,即把上限、下限以及有关函数的入口地址传送给形参fun。在执行integral函数过程中求出各函数定积分的值。
在面向对象的C++程序设计中,这种用法就比较少了。有兴趣的读者可参阅作者所著的《C程序设计(第二版)》一书中的有关章节。
......
C++入门6.5 函数与指针(2008-10-09 08:57:00)
摘要:
6.5.1 用函数指针变量调用函数
指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
例6.14 求a和b中的大者。
先按一般方法写程序:
#include <iostream>
using namespace std;
int main( )
{int max(int x,int y); //函数声明
int a,b,m;
cin>>a>>b;
m=max(a,b); //调用函数max,求出最大值,赋给m
cout<<″max=″<<m<<endl;
return 0;
}
int max(int x,int y)
{int z;
if(x>y) z=x;
else z=y;
return(z);
}
可以用一个指针变量指向max函数,然后通过该指针变量调用此函数。定义指向max函数的指针变量的方法是:
int (*p) (int,int);
p所指向的函数的形参类型
&n......