本文参考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 = , value2 = ;
int *p1, *p2;
p1 = &value1; // p1 = address of value1
p2 = &value2; // p2 = address of value2
*p1 = ; // value pointed by p1 = 10
*p2 = *p1; // value pointed by p2 = value pointed by p1
p1 = p2; // p1 = p2 (value of pointer copied)
*p1 = ; // value pointed by p1 = 20
cout << "value1==" << value1 << "/ value2==" << value2;
return ;
}
(3)指针和数组
数组与指针的概念联系非常紧密。数组的标识符相当于它的第一个元素的地址,就像一个指针相当于它所指向的第一个元素的地址一样。
例如:
int numbers[];
int *p;
下面的赋值是合法的:
p=number;
这里指针p 和numbers 是等价的,它们有相同的属性,唯一的不同是我们可以给指针p赋其它的数值,而numbers 总是指向被定义的20个整数组中的第一个。所以,p是一个普通的指针变量,而与之不同,numbers是一个指针常量(constant pointer),数组名的确是一个指针常量。因此虽然前面的赋值表达式是合法的,但下面的不是:
numbers = p;
因为number 是一个数组(指针常量),常量标识不可以被赋其它数值。
//数组(常量指针)指向内存中一段连续的地址空间
#include <iostream.h>
int main () {
int numbers[];
int * p;
p = numbers; //把数组numbers的首地址赋值给指针变量p
*p = ; //通过指针p给数组的第一个元素赋值为10
p++; //指针地址值加上一个整型变量所占的内存大小
*p = ; //给数组的第二个元素赋值
p = &numbers[];
*p = ; //给数组的第三个元素赋值
p = numbers + ;
*p = ; //给数组的第三个元素赋值
p = numbers; *(p+) = ;
for (int n=; n<; n++) //输出数组的所有元素值
cout << numbers[n] << ", ";
return ;
}
(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++;