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
*/

posted @ 2021-01-04 19:26  伊万夫斯基  阅读(97)  评论(0编辑  收藏  举报