• 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
    */
    
    
  • 相关阅读:
    北京六环附近及往内的可驾驶道路网络(路网graph为连通图)
    OSM数据处理-python工具包
    小程序踩坑
    小程序基本配置
    JavaScript 基础(四):Array
    MYSQL--慎用group_concat()
    真正高效的SQLSERVER分页查询
    PhpStorm Git 操作
    linux 查看当前目录文件的大小
    @PostConstruct和@PreDestroy的使用说明
  • 原文地址:https://www.cnblogs.com/benjieqiang/p/14231783.html
Copyright © 2020-2023  润新知