Files
2019-06-26 18:11:35 +08:00

3.0 KiB
Raw Permalink Blame History

指针

1. 什么是指针

在计算机中,每个变量都会存放在内存中分配的一个空间,每个字节都会有一个地址,即变量存放的位置。指针可以理解为变量的地址。地址也可以通过取地址符被获取到,只要在变量前面加上&,就表示变量的地址。

例如一个定义为 int a的整型变量 &a 就表示它的地址。 #include using namespace std; int main(){ int a = 1; cout << &a; return 0; } // 0x6ffe4c

2. 指针变量

指针变量用来存放指针(或者可以理解成地址),这个关系就跟 int 型变量用来存放 int 型变量相同。可以把地址当作常量,然后专门定义了一种指针变量来存放它。但是指针变量的定义和普通变量有所区别,它在某种数据类型后加 * 来表示这是一个指针变量,例如下面这几个定义:

int* p;
double* p;
char* p;

注意: 星号 * 的位置在数据类型之后或是在变量名之前都是可以的。其中C程序员习惯于把 * 放在变量名之前,而 C++ 程序员更习惯于把星号放在数据类型之后。

正如刚才所说,指针变量存放的时地址,而 & 则是取地址运算符,因此给指针变量赋值的方式一般是把变量的地址取出来,然后赋给对应类型的指针变量:

int a;
int* p = &a;

需要注意的是, int* 是指针变量的类型,而后面的 p 才是变量名,用来存储地址,因此地址 &a 是赋值给 p 而不是 *p 的。

那么,对一个指针变量存放的地址,如何得到这个地址的元素呢?其实还是用 星号* 。假设定义了 int* p = &a, 那么指针变量 p 就存放了 a 的地址。为了通过 p 来获得变量a 可以把星号*视为一把开启房间的钥匙,将其加在 p 的前面, 这样 p 就可以把房间打开然后获得变量a的值。 #include using namespace std' int main(){ int a; int p = &a; a = 223; cout << p << endl; return 0; } // 223 另外指针变量也可以进行加减法。对一个int 型的指针变量 P 来说, p + 1 是指 p 所指的 int 型变量的下一个 int 型变量地址。

3. 指针和数组

先看一个例子

#include <iostream>
using namespace std;
int main(){
    int a[10] = {1};
    int* p = &a;
    cout << *p;
    return 0;
}
// 1

在C语言中数组名称也作为数组的首地址使用 a + i则表示 &a[i] *(a + i) 则等于 a[i]

4. 指针变量作为函数参数

指针类型也可以作为函数参数的类型,这时视为变量的地址传入函数。如果在函数中对这个地址中的元素进行改变,原先的数据就会确实的改变。

#include <stdio.h>
 void change(int* p){
     *p = 223;
 }
 
 int main(){
 int a = 1;
 int* p = &a;
 change(p);
 printf("%d\n", a);
 return 0;
 }
 // 223