C++C++指针学习笔记

本文参考http://www.prglab.com/cms/pages/c-tutorial/advanced-data/pointers.php

1.储存其它变量地址之变量(如下面例子中的address),我们叫指针(pointer)。

 

2.地址操作符/去引用操作符

于变量号称标识符前面添加的以及符号ampersand sign
(&),该符号表达的意思是“……的地址(address of
…)”,所以叫地址操作符。

例如:address=&value1;      //address 表示 value1 的地址

拿变量value1的地方与给变量address,因为当以变量名称value1前面加ampersand
(&) 符号,我们依靠的用不再是拖欠变量的情,而是它以内存中之地点。

 

3.引用操作符(*)

动指针的时候,我们可以通过当指针标识的面前加星号asterisk
(*)来囤该指针指向的变量所蕴藏的数值,它可为翻为“所针对的数值”(”value
pointed by”)。

例如  value=*address;                    //value 为 address
所指向的数值

 

地点或反引用操作符Operator of
address or dereference (&)

其给作为一个变量前缀,可以吃翻啊“…的地方”(“address
of”),因此:&variable1 可以给读作 variable1的地址(“address of variable1”
)。

援操作符Operator of
reference (*)

它象征要取的是表达式所表示的地方指向的情。它可以于翻为“…指向的数值”
(“value pointed by”)。

* mypointer 可以叫读作
“mypointer指向的数值”。

 

4.指针的扬言与用

(1).指针的声明

    type *
pointer_name;

    其中type指的凡指针所据为变量的档次,pointer_name指的凡依靠针变量的名字;

  例如: int * number;
      char * character;
      float * greatnumber;

(2)指针的利用

 

#include <iostream.h>

int main () {
int value1 = 5, value2 = 15;
int *p1, *p2;
p1 = &value1; // p1 = address of value1
p2 = &value2; // p2 = address of value2
*p1 = 10; // value pointed by p1 = 10
*p2 = *p1; // value pointed by p2 = value pointed by p1
p1 = p2; // p1 = p2 (value of pointer copied)
*p1 = 20; // value pointed by p1 = 20
cout << "value1==" << value1 << "/ value2==" << value2;
return 0;
}

(3)指针和数组

数组与指针的概念联系好紧。数组的标识符相当给它们的率先个要素的地方,就像一个指南针相当给她所针对的率先独要素的地址一样。

例如:

int numbers[20];
int *p;

脚的赋值是合法的:

p=number;

此间指针p 和numbers
是相等价格的,它们有同等之性,唯一的不等是我们好吃指针p赋其它的数值,而numbers
总是指于被定义的20单整数组吃之首先只。所以,p是一个寻常的指南针变量,而跟的异,numbers是一个指南针常量(constant
pointer),数组名的确是一个指南针常量。因此虽然前的赋值表达式是合法的,但下的非是:

numbers = p;

因number 是一个数组(指针常量),常量标识不可以吃赋予其它数值。

//数组(常量指针)指向内存中一段连续的地址空间
#include <iostream.h>
int main () {
int numbers[5];
int * p;
p = numbers;                  //把数组numbers的首地址赋值给指针变量p
*p = 10;             //通过指针p给数组的第一个元素赋值为10
p++;                //指针地址值加上一个整型变量所占的内存大小
*p = 20;              //给数组的第二个元素赋值
p = &numbers[2];           
*p = 30;              //给数组的第三个元素赋值
p = numbers + 3; 
*p = 40;              //给数组的第三个元素赋值
p = numbers; *(p+4) = 50; 
for (int n=0; n<5; n++)     //输出数组的所有元素值
cout << numbers[n] << ", "; 
return 0; 
}

(4)指针的数学运算

本着指针只有加法和减法运算,其它运算在指针世界里从未意义。但是指针的加法和减法的有血有肉运算根据她所针对的数目的种类的轻重的两样而有所不同。我们明白不同的数据类型在内存中占据的仓储空间是勿平等的。例如,字符char
占用1 个字节(1 byte),短整型short 占用2 单字节,长整型long 占用4单字节。

一经我们发3只指针:

char *mychar;
short *myshort;
long *mylong;

同时,假要他们分别对内存的地方也1000, 2000
和3000。当他们分别进行自加运算后底效力如下:

mychar++;             //mychar的地址变为1001
myshort++;           //myshort的地址变为2002
mylong++;            //mylong的地址变为3004

待注意的凡:递增 (++) 和递减 (–)
操作符比引用操作符reference operator (*)有再次强之先行级

*p++;          //等同于(*(p++)),它所作的是增加p (它所指向的地址,而不是它存储的数值)
*p++ = *q++;      //两个递增操作(++) 都是在整个表达式被计算之后进行而不是在之前,所以*q 的值首先被赋予*p ,然后q 和p 都增加1,
//它相当于:
*p = *q;
p++;
q++;