C++指针初探
指针
每个变量都有一个内存位置,可使用&运算符进行访问,表示内存中的一个地址。
定义
指针是一个变量,其值为另一个变量的地址。
使用指针三部曲:
定义一个指针变量;
把变量地址赋值给指针;
访问指针变量中可用地址的值。
int var = 20;
int * p; //定义一个指针;
p = &var; //p中存储变量var的地址;
*p // 访问指针中的地址的值。
空指针
int * ptr = NULL;
ptr的值为0;
内存地址为0表示该指针所存储的位置时一个不能访问的内存,该内存是操作系统保留的,惯例假定不指向任何东西。
指针算数运算
指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。
#include <iostream>
using namespace std;
int main() {
int var = 10;
int * ptr = &var;
cout<<"ptr的值"<<ptr<<endl;//0x7ffcedba7d94
ptr++;
cout<<"ptr++后的值"<<ptr<<endl;
return 0;
}
/*
ptr的值0x7fff90817c54
ptr++后的值0x7fff90817c58
*/
递增,递减,比较
#include <iostream>
using namespace std;
const int MAX = 3;
int main(void){
int var[MAX] = {10,100,200};
int * ptr1;
int * ptr2;
// 指针指向数组第一个元素的地址
ptr1 = var;
for(int i = 0;i < MAX;i++){
cout<<"var["<<i<<"]="<<*ptr1<<" address="<<ptr1<<endl;
ptr1++;
}
// 指针指向数组最后一个元素的地址
ptr2 = &var[MAX -1];
for(int i = MAX;i > 0;i--){
cout<<"var["<<i<<"]="<<*ptr2<<" address="<<ptr2<<endl;
ptr2--;
}
// 比较
int i = 0;
while ( ptr1 <= &var[MAX - 1] )
{
cout<<"var["<<i<<"]="<<*ptr1<<" address="<<ptr1<<endl;
// 指向上一个位置
ptr1++;
i++;
}
return 0;
}
var++ 是错误的,var是一个指向数组开头的常量。
指针数组
让数组存储指向 int 或 char 或其他数据类型的指针
int var[MAX] = {10, 100, 200};
int *ptr[MAX];
for (int i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; // 赋值为整数的地址
}
此时*ptr[i]表示数组中i对应的值;
https://www.runoob.com/cplusplus/cpp-array-of-pointers.html
char *names[MAX]
含义为:指针数组,即数组的每个元素都是一个指向 char 类型元素的指针;
通过 {...} 中的初始化内容我们可以发现,这个数组的每个元素被赋值了一个字符串,显然这个元素必然为一个指向 char 类型数组的指针;
简单说,char *names[MAX]
中的元素是指向四个 char 类型数组的指针 names[i]。
指向指针的指针
指向指针的指针,指针链。第一个指针存放第二个指针的地址,第二个指针存放的是实际值的地址。
int var = 3000;
int *ptr = &var;
int **pptr = &ptr;
#include<iostream>
using namespace std;
int main(){
int var;
int *ptr;
int **pptr;
var = 3000;
// 获取 var 的地址
ptr = &var;
// 使用运算符 & 获取 ptr 的地址
pptr = &ptr;
// 使用 pptr 获取值
cout << "var 值为 :" << var << endl;
cout << "*ptr 值为:" << *ptr << endl;
cout << "**pptr 值为:" << **pptr << endl;
return 0;
}
传递指针给函数
把函数参数声明为指针类型
举例:
#include<iostream>
using namespace std;
void changeNum(int * num);
int main(){
int num = 10;
cout << "Value of num:"<< num <<endl;
changeNum(&num);
cout << "Changed value of num:"<< num <<endl;
return 0;
}
void changeNum(int * num){
*num = 20;
}
/*
Value of num:10
Changed value of num:20
*/