间接访问数据(一)

指针的概念

计算机会为每一个存储数据的内存分配一个地址,以便以计算机引用所存储的具体数据项,指针变量即用来存储特定类型的另一个变量的地址。就像其他变量一样,指针变量也有名称,而且指针还有类型,以指出其引用的是什么类型的变量。如果某个指针变量可以存储包含int类型值的内存位置的地址,则该变量的类型是“指向int”类型的指针。

 

声明指针

在指针名称前面用*表明指针,其余与声明普通变量一样。

long* pnumber; //*离类型名更近

long *pnumber; //*离变量名更近

以上两种声明方法皆可。

在C++中,使用以字母p开头的变量名称表示指针是通用惯例,这样是我们能更容易看清程序中哪些变量是指针,从而是程序更易于理解。

为了获取变量的地址,可以使用一元运算符&(取址运算符)进行操作。

pnumber = &number; //获取变量number的地址并赋给指针pnumber。

 

使用指针

间接寻址运算符*

将间接寻址运算符*与某个指针一起使用,可以访问该指针指向的变量的内容。该运算符也称为解除引用运算符,而访问指针所指的变量中数据的过程称为接触引用指针。编译器能根据上下文区分该运算符表示的意义,从而不至于混淆*的用途。

 

为什么使用指针?

为什么一定要使用指针?毕竟,取出我们已经知道的某个变量的地址,然后将其放入某个指针内,以便能够解除对该指针的引用,看起来似乎是完全不必要的开销。但指针实际上非常重要,原因不止一种。

我们可以使用指针运算符处理数组中存储的数据,相应的执行速度往往比使用数组符号要快。另外,在定义自己的函数时广泛使用指针,能够在函数内部访问在函数外部定义的大块数据(如数组)。但最重要的一点是是我们能够动态地(即在程序执行过程中)为变量分配存储空间。这种功能使程序可以根据实际的输入,调整自己的内存使用量。因为预先不知道将动态创建多少个变量,所以首选方法是使用指针。

 

初始化指针

使用为初始化的指针是非常危险的。我们很容易通过未初始化的指针重写随机的内存区域,由此产生的危害完全取决于我们的运气,因此,初始化指针实在是一个好主意。

int number(0); //初始化int类型的变量number

int* pnumber(&number); //将number的地址赋给指针变量pnumber来初始化指针

记住,当用另一个变量的地址初始化某个指针变量时,必须在指针声明之前已经声明过该变量。

Visual C++也提供了一种不指向任何对象的指针字面值nullstr,因此我们可以使用下面这条语句来声明并初始化指针。

int* pnumber(nullstr);

nullstr可以隐式转换为任何指针类型,但不能隐式转换为除bool类型以外的任何其他整数类型。

char*类型的指针具有非常有意思的属性,即可以用字符串字面值初始化。

例如:char* proverb ("A miss is as good as a mile.");

该语句与初始化char数组有所区别,这条语句用引号之间的字符串创建某个以\0终止的字符串字面值,并将该字面值的地址存储在指针proverb中。该字面值的地址将是其第一个字符的地址。

cout<< proverb <<endl;

该语句将输出字符串"A miss is as good as a mile."(不包括引号),而不是该指针指向的地址。因为输出操作以一种特殊的方式看待“指向char”类型的指针,即将其视为字符串(即char数组),因此输出字符串本身,而不是字符串的地址。使用指针消除了使用数组出现的内存浪费现象。,但似乎有点儿冗长,应当使用更好的方法,就是使用指针数组。

在char类型的指针数组中,每个元素可以指向一个独立的字符串,各个字符串的长度可以不同。可以用与声明普通数组完全相同的方式来声明指针数组。

char* pstr[] = { "Robort Red",

                           "Hope Cass",

                           "Lily"};

cout<< pstr[2] << endl; //输出Lily

posted @ 2013-11-07 22:46  jiangjiuwen  阅读(805)  评论(0编辑  收藏  举报