c++中与指针相关一些基本知识

来源:互联网 发布:淘宝上货最少几件 编辑:程序博客网 时间:2024/06/16 11:39

(1)我们知道变量的定义基本形式是:类型说明符+一个或者多个标识符列表(以逗号隔开)+“;”结束。例如:

int a;

int mouth,day,year;

double price;   等等。

(2)那么指针的定义呢?在c++语言中,使用“*”符号把一个标示符声明为指针,例如:

int *p1,*p2;

string *pstring;

double *dp;

在有些时候你会看到指针的另一中声明(用空格将符号*和后面的标示符分隔开来): string* pS;(把pS定义为一个指向string类型的指针)。这是合法的。但是这样容易产生一种误解。在一个声明语句拥有多个标识符的情况下:string* ps1,ps2;实际上只把ps1定义为指针,而ps2不是,只是一个普通的string类型对象而已。所以习惯用这种方式的,得注意这点。

我们知道,对于一个指针的有效状态有三种:1、保存一个特定对象的地址,2、指向某个对象后面的另一个对象,3、0值(若指针保存0值,表面它不指向任何对象)。未初始化的指针是无效的,直到给指针赋值后,才能使用它。

int  *pi=0;表示pi不指向任何对象。

int *pi1=&val;pi1指向对象val

pi1=0; pi1不指向任何对象

int  *pi2=NULL;     等价于 int *pi=0;(注:编译时,会自动将NULL 换成0)

另外,c++提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址。void* 表明该指针与一地址相关,但不清楚存储在此地址上的对象的类型。所以,其支持的操作也有限:1、与另一个指针进行比较;

2、向函数传递void* 指针或从函数返回void*指针

3、给另一个void*指针赋值、

不允许使用void*指针操作它所指的对象。

(3)指向指针的指针

指针本身也是可用指针指向的内存对象。指针占用内存空间存放其值,因此指针的存储地址可存放在指针中。

int **p=&val;   ——>  一个指向指针的指针,它指向的指针是指向一个整形数。

(4)指针与引用的比较

虽然引用(reference)和指针都可以间接访问另一个值,但它们有两个重要的区别。第一个区别,引用总是指向某个对象:定义引用时没用初始化是错误的;第二个区别,赋值行为的差异:给引用复制修改的是该引用所关联的对象的值,而并不是应用与另一个对象的关联。引用一经初始化,就始终指向同一个特定的对象。

int &r1=val1,&r2=val2;

r1=r2;   这个赋值操作修改了r1引用的值val1对象,而并非引用本身。赋值后,这两个引用还是分别指向原来关联的对象,此时这两个对象的值相等。

(5)指向数组元素的指针

 int a[10];     //定义一个整形数组a,它有10个元素

int *p;   //定义一个基类型为整形的指针变量p

p=&a[0];    ------p=a;    (注:这两个是等价的)在c++中,数组名代表数组中第一个元素(序号为0的元素)的地址。

(6) 指向数组的指针

int (*p) [n];  //表示指针变量p指向的是含有n个整形元素的一维数组。

(7)指针数组

如果一个数组,其元素均为指针类型数据,该数组称为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址。一维指针数组的定义形式为:
     类型名 *数组名[数组长度];
例如:
    int *p[4];
可以用指针数组中各个元素分别指向若干个字符串,使字符串处理更加方便灵活。

(8)函数的指针

指针变量也可以指向一个函数。一个函数在编译的时候被分配一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。

定义指向函数的指针变量的方法是:函数类型 (*指针变量名) (函数形参表);

int (*p)(int ,int );  //  int 表示指针变量p指向的函数的类型

//(int ,int )中 int 表示p指向的函数的形参类型

//p 表示指向函数的指针变量

(9)返回指针值的函数

一个函数可以返回一个整形值、字符值等等,也可以返回一个指针型的数据,即地址。返回指针值的函数简称为指针函数

定义形式:

类型名 *函数名(参数列表);

int  *max(int x, int y);


                               


0 0
原创粉丝点击