组别:普及组
难度:4
一、内存地址
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:
1 2 3 4 5 6 7 8 9 10 11 12 | include <iostream> using namespace std; int main () { int var1; char var2[10]; cout << "var1 memory address: "; cout << &var1 << endl; cout << "var2 memory address: "; cout << &var2 << endl; return 0; } |
二、指针
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。在32位系统内存下占4个byte(64位系统内存下占8个byte),eg:0x0000FF00,就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
类型说明符 *变量名;
type *variable_name;
在这里,type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:
int *ip; /* 一个整型的指针 */ double *dp; /* 一个 double 型的指针 */ float *fp; /* 一个浮点型的指针 */ char *ch; /* 一个字符型的指针 */
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
普通变量定义 int a=5;
定义了变量 a,是 int 型的,值为 5。内存中有一块内存空间是放 a 的值,对 a 的存取 操作就是直接到这个内存空间存取。内存空间的位置叫地址,存放5的地址可以用取地址操 作符“&”对 a 运算得到:&a。
指针变量定义
int *p; p=&a;
int *p=&a;
不允许把一个数赋予指针变量,故如下的赋值是错误的:int *p;p=1000;。被赋值的 指针变量前不能再加“*”说明符,故如下的赋值也是错误的:*p=&a;。
指针的几个相关操作说明表
说明 | 样例 |
指针定义:类型说明 *指针变量名; | int a=5; int *p; |
取地址运算符 & | p=&a; |
间接运算符 * | *p=20; |
指针变量直接存取的是内存地址 | cput<<p; 结果可能是:0x4097ce |
间接存储的才是存储类型的值 | cout<<*p; 结果是:20 |
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须被赋值具体的值,未经 赋值的指针变量不能使用。如定义了 int a; int *p=&a;,则*p 表示 p 指向的整型变量,而 p 中存放的是变量 a 占用单元的起始地址,所以*p 实际上访问了变量 a,也就是说*p 与 a 等价。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include<iostream> using namespace std; int main() { int a,b,s,t; int *pa,*pb; pa=&a; pb=&b; a=10; b=20; cout<<a+b<<endl; cout<<&a<<' '<<&b<<endl; cout<<pa<<' '<<pb<<endl; cout<<*pa<<' '<<*pb<<endl; cout<<*pa+*pb; } |