3.0 KiB
指针
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