指针

组别:普及组
难度:4

一、内存地址

每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:

MemoryAddressContent.png
 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;
 }

edit & run

二、指针

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。在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;

Pointers

不允许把一个数赋予指针变量,故如下的赋值是错误的: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;
}

edit & run

Scroll to Top