精华内容
下载资源
问答
  • C/C++语言中,二级指针,表示一级指针的地址,例如: int**p1; int* p2; p1 = &p2; 具体用法示例: #include<iostream> using namespace std; struct Teacher { char name[64]; int age; }; int ...

    C/C++语言中,二级指针,表示一级指针的地址,例如:

    int**p1;
    int* p2;
    p1 = &p2;
    

    具体用法示例:

    #include<iostream>
    
    using namespace std;
    struct Teacher
    {
    	char name[64];
    	int age;
    };
    
    int getTeacherAge(Teacher** p)
    {
    	Teacher* tmp = (Teacher*)malloc(sizeof(Teacher));// 在堆上开辟空间
    	if (!tmp)
    	{
    		return -1;
    	}
    	if (!p)
    	{
    		return -1;
    	}
    
    	tmp->age = 34;
    	*p = tmp;// p为二级指针,*p为一级指针
    
    }
    void main()
    {
    	Teacher* mT1 = NULL;
    	getTeacherAge(&mT1);// 二级指针,一级指针的地址值
    
    	cout << "mT1->age: " << mT1->age << endl;
    	system("pause");
    }
    

    输出结果为:
    在这里插入图片描述

    展开全文
  • 文章目录二级指针概念二级指针应用之一:删除链表的结点二级指针应用之二:删除链表中的重复元素更多应用等待探索... 二级指针概念 普通的指针变量,实际上就是存储值类型的地址,这被称为一级指针。而二级指针就是...

    二级指针概念

    普通的指针变量,实际上就是存储值类型的地址,这被称为一级指针。而二级指针就是存储一级指针的变量地址。

    C语言的二级指针在用到动态二维数组的时候经常用到,除此之外,我们还经常利用二级指针充当地址引用(比普通引用灵活很多可以自由赋值)来做一些意想不到的操作!

    比如接下来要讲的链表的删除元素操作。我喜欢把指针作为一个灵活的引用来描述,因为它能做的行为和引用无异。

    这样用二级指针处理链表的好处在于可以直接处理堆内存中的next指针的值!!!

    二级指针应用之一:删除链表的结点


    OJ平台

    typedef struct ListNode ListNode;
    struct ListNode* deleteNode(struct ListNode* head, int val){
        if(head->val == val) return head->next;
            ListNode* p,** q = &head;//q取得head的引用
            while((p=*q)!=NULL){
                if(p->val==val){//一旦出现目标值的情况,就改变引用对应的值
                    *q = p->next;
                    free(p);
                    p = NULL;
                    break;
                }
                else//对这个内存块里的next指针加以引用
                q = &p->next;
            }
            return head;
    }
    

    二级指针应用之二:删除链表中的重复元素


    OJ平台

    typedef struct ListNode ListNode;
    struct ListNode* deleteDuplicates(struct ListNode* head){
        if(!head) return head;
        ListNode* p,** q = &head;
        while((p=*q)!=NULL){
            if(p->next&&p->val==p->next->val){
                *q = p->next;
                free(p);
                p = NULL;
            }
            else
                q = &p->next;
        }
        return head;
    }
    

    更多应用等待探索…

    展开全文
  • 二级指针应用

    2019-09-05 19:36:14
    一直很困惑二级指针到底有什么用?我们都知道二级指针是指向指针的指针。 后来碰到一个问题,就是实现一个函数,传入两个指针,指针代表两个数组, 然后去比较两个数组是否相等。 可以说非常容易实现。 bool compare...

    一直很困惑二级指针到底有什么用?我们都知道二级指针是指向指针的指针。
    后来碰到一个问题,就是实现一个函数,传入两个指针,指针代表两个数组,
    然后去比较两个数组是否相等。
    可以说非常容易实现。

    bool compare(int *p1,int *p2,int n)
    {
        for(int i=0; i<n; i++) {
            if(*p1 == *p2) {
                p1++;
                p2++;
                continue;
            } else {
                return false;
            }
        }
        return true;
    }
    int main() {
    	int a[] = {1,2,3,4,5};
        int b[] = {1,2,3,4,5,6,7};
    	cout<<compare(a,b,5)<<endl;
    	cout<<*b<<endl;
    }
    

    结果为:1,1
    但是,如果我们要继续操作b的与a不相等的地方,也就是从6开始,就必须重新定位到6。因为函数传入参数在函数体内会进行拷贝,此时指针b没有变化。
    这时,就要用到二级指针了。代码如下:

    bool compare(int **p1,int **p2,int n)
    {
        for(int i=0; i<n; i++) {
            if(**p1 == **p2) {
                (*p1)++;
                (*p2)++;
                continue;
            } else {
                return false;
            }
        }
        return true;
    }
    int main()
    {
        int a[] = {1,2,3,4,5};
        int b[] = {1,2,3,4,5,6,7};
        int *ptr1 = a;
        int *ptr2 = b;
        int **ptr_1 = &ptr1;
        int **ptr_2 = &ptr2;
        cout<<compare(ptr_1,ptr_2,5)<<endl;
        cout<<**ptr_2;
    }
    

    结果:1,6
    这是因为我们传入的参数是一个二级指针,它永远指向要递增操作的一级指针,在compare函数内,一级指针在递增,我们要得到递增后的状态,只需要解引用二级指针即可。

    再举例一个二级指针的应用,来自程序员面试宝典传递动态内存。

    • 首先看下面代码,找出问题在哪
    void GetMemory(char *p, int num)
    {
    	p = (char*)malloc(sizeof(char) * num);
    };
    int main()
    {
    	char *str = NULL;
    	GetMemory(str, 100);
    	strcpy(str, "hello");
    	return 0;
    }
    

    函数GetMemory是有问题的,参数*p实际上是主函数str的一个副本,本例中p申请了新的内存,只是把p所指的内存地址改变了,但是str丝毫未变。所以会造成内存泄漏。

    • 如何修改?
      • 第一种方式:使用二级指针
      void GetMemory(char **p, int num)
      {
      	*p = (char*)malloc(sizeof(char) * num);//*p是解引用二级指针
      };
      int main()
      {
      	char *str = NULL;
      	GetMemory(&str, 100);
      	strcpy(str, "hello);
      	cout << *str << endl;
      	free(str);
      	return 0;
      }
      
      此时传入的是二级指针,也即str的地址,它也进行了拷贝,但是没关系,只要一级指针申请到了内存即可。
      • 第二种方式:使用返回值
      char *GetMemory(char *p, int num)
      {
        p = (char*)malloc(sizeof(char) * num);
        return p;
      };
      int main()
      {
      	char *str = NULL;
      	str = GetMemory(str, 100);
      	strcpy(str, "hello");
      	free(str);
      	return 0;
      	}
      
      返回值即为原来的str指针。
    展开全文
  • C语言_二级指针用法

    2019-11-29 21:50:05
    typedef int (init_fnc_t) (void); //定义了一个函数 ...//二重指针的作用有2个,一个是用来指向指针数组,一个是用来指向一重指针 init_fnc_t *init_sequence[] = { cpu_init, #if defined(CONFI...
    typedef int (init_fnc_t) (void); //定义了一个函数
    init_fnc_t **init_fnc_ptr;  //定义了一个指向init_fnc_t类型的二重函数指针
    //二重指针的作用有2个,一个是用来指向指针数组,一个是用来指向一重指针
    
    init_fnc_t *init_sequence[] = {
    	cpu_init,		
    #if defined(CONFIG_SKIP_RELOCATE_UBOOT)
    	reloc_init,		
    #endif
    	board_init,		
    	interrupt_init,		
    	env_init,		
    	init_baudrate,		
    	serial_init,		
    	console_init_f,		
    	display_banner,		
    #if defined(CONFIG_DISPLAY_CPUINFO)
    	print_cpuinfo,		
    #endif
    #if defined(CONFIG_DISPLAY_BOARDINFO)
    	checkboard,		
    #endif
    #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
    	init_func_i2c,
    #endif
    	dram_init,		
    	display_dram_config,
    	NULL,
    }; //定义了一个函数指针数组
    
    for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
    		if ((*init_fnc_ptr)() != 0) {
    			hang ();
    		}
    	}
    /* 
    for循环执行init_sequence
    (1)init_sequence是一个函数指针数组,数组中存储了很多个函数指针,这些指向指向的函数都是init_fnc_t类型(特征是接收参数是void类型,返回值是int)。
    (2)init_sequence在定义时就同时给了初始化,初始化的函数指针都是一些函数名。(C语言高级专题中讲过:函数名的实质)
    (3)init_fnc_ptr是一个二重函数指针,可以指向init_sequence这个函数指针数组。
    (4)用for循环肯定是想要去遍历这个函数指针数组(遍历的目的也是去依次执行这个函数指针数组中的所有函数)。思考:如何遍历一个函数指针数组?有2种方法:第一种也是最常用的一种,用下标去遍历,用数组元素个数来截至。第二种不常用,但是也可以。就是在数组的有效元素末尾放一个标志,依次遍历到标准处即可截至(有点类似字符串的思路)。
    我们这里使用了第二种思路。因为数组中存的全是函数指针,因此我们选用了NULL来作为标志。我们遍历时从开头依次进行,直到看到NULL标志截至。这种方法的优势是不用事先统计数组有多少个元素。
    (5)init_fnc_t的这些函数的返回值定义方式一样的,都是:函数执行正确时返回0,不正确时返回-1.所以我们在遍历时去检查函数返回值,如果遍历中有一个函数返回值不等于0则hang()挂起。从分析hang函数可知:uboot启动过程中初始化板级硬件时不能出任何错误,只要有一个错误整个启动就终止,除了重启开发板没有任何办法。
    (6)init_sequence中的这些函数,都是board级别的各种硬件初始化。
    */
    
    
    展开全文
  • 一级指针:就是指针,即一个指向一块内存的地址,有了这个地址,我们就可以对这块内存进行读写操作 ...二级指针:指针的指针,也就是指向一块内存的指针的地址,因为指针本身也有自己的存储地址 ...
  • void ** 二级指针用法

    2020-08-27 16:58:39
    目的: 实现将子函数中的数据“浅拷贝”到上层函数(只把指针读进来) #include <stdio.h> char Buf[6]={1,2,3,4,5,6}; int func_A(void **aplbuf, int *apllen) { *aplbuf = Buf; *apllen = 110; } int ...
  • 在之前的文章 《二级指针的作为函数形参的深入理解》 我们分析了二级指针的使用,这里我们再简单的的做个小结。 一级指针作为入参 一级指针作为入参,在函数内部是要对该指针进行 简介引用,操作一级指针指向的内存...
  • 主要介绍了C语言中二级指针的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握理解二级指针的知识,需要的朋友可以参考下
  • 所以,当我们定义了一个指向指针的指针的时候(pointer to pointer),我们也称之为二级指针,那针对于这个二级指针来说,第一级指针存放的是指向的变量的地址,第二级指针存放的是第一级指针的地址。可以用下面这张图...
  • 二级指针用法示例

    千次阅读 2015-08-27 17:31:44
    1、二级指针的第一种用法:指针数组 2、二级指针的第二种内存模型:二维数组 3、二级指针的第三种内存模型:扔开C编译器,手工打造二维内存 4、总览二级指针的三种内存模型: 5、三种内存模型综合演练:
  • C/C++中二级指针典型应用场景
  • 二级指针三种用法总结

    千次阅读 2018-06-07 17:23:36
    1.在栈区建立数组,指向常量区数据...这种用法可以通过二级指针进行传参 void PrintfStr(char **cpoint); 当想访问“111111”时的时候 采用以下两种方法 1:printf("%s",cpoint[0]); 2:printf("%s",*(cpoint...
  • 转载:http://c.biancheng.net/cpp/html/85.html指针可以...如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p...
  • 二级指针使用场景

    2020-12-09 00:24:52
    这个时候一直无人问津的二级指针跳了出来,你知不知道,我很重要。 修改2: #include #include #include void ApplyMemory(char** p) { (*p) = (char*)malloc(11); } int main() { char* val = NULL; ApplyMemory(&...
  • C语言二级指针与典型应用(1)

    千次阅读 多人点赞 2018-03-25 16:44:30
    二级指针的定义:A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量.本质:二级指针变量的值是一个地址。一、概念在如下的A指向B、B指向C的指向关系中:首先,默认的编译器是32...
  • 所以,当我们定义了一个指向指针的指针的时候(pointer to pointer),我们也称之为二级指针,那针对于这个二级指针来说,第一级指针存放的是指向的变量的地址,第二级指针存放的是第一级指针的地址。可以用下面这张图...
  • 二级指针的作用详解

    万次阅读 多人点赞 2015-06-25 00:37:47
    一、概念 在如下的A指向B、B指向C的指向...B是一个指针变量,其中存放着C的地址,但是B也要占空间的啊,所以B也有地址,B的起始地址是0x00000004,但是B内存中存放的是C的地址,所以B里面的内容就是0x00000008。 那么到此
  • 一级指针与二级指针的定义以及使用详解 首先说下一级指针和二级指针概念: 一级指针: int a; int *p;//指针指向地址 p = &a; &p//指针所在内存的地址 p//指针p的值,也就是所指向内存区的地址(a的地址) *...
  • 其次是就算理解了概念,在实际使用指针或者在代码中碰到指针的时候(尤其是一级、二级指针同时出现的时候),就更加模糊不清,最近花时间看了很多资料后终于完全理解了指针的用法本质(包括一级指针和二级指针),...
  • 关于C语言二级指针正确使用总结

    千次阅读 2020-02-10 15:39:45
    关于C语言二级指针正确使用总结 什么是二级指针 C语言中的二级指针其实就是指向指针的指针,指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。同理可以构建三级或者N级指针,但是一般情况下用不到多级...
  • 一级指针和二级指针的理解和总结

    千次阅读 多人点赞 2019-02-10 20:17:10
    级指针 对于一级指针来讲, 我们再熟悉不过的应用就是修改实参的值 注意下方应用: #include &lt;stdio.h&gt; void changeValue(int* value); int main() { ...
  • 指针的使用二级指针

    2017-11-24 17:06:11
    // 二级指针的使用 [11/24/2017 Andrew]struct Teacher { char name[64]; int age; }; // 在被调用函数中获取资源必须使用二级指针,因为局部函数 //中申请的变量会在函数调用结束的时候被释放掉,因此要使用二级...
  • C语言中二级指针使用

    千次阅读 2017-08-07 18:17:48
    C/C++中使用指针可以减少函数传递的参数 例如:typedef struct { int r[MAX]; int length;...使用指针可以传递结构体,或者数组指针主要用在在子函数中有新生成的变量需要回传回主函数。void main() {
  • 这个p2就是二级指针(这里只是举例子,在实际应用中一般不会这样用),p其实也是一个数值,只是这个数值是地址,然后对这个地址再取地址,并赋值给p2,就得到了一个二级指针 二级指针就是指针的指针,针对指针的...
  • 二级指针: 二级指可以理解为一个二维数组,但有...下面函数通过传递输出参数的方式应用二级指针: void func2(char**args, int &num, int* lens) { int count = 3; const char *iface[] = {"getStatus", ...
  • 这个函数的作用是,给主函数的变量间接赋值,这是二级指针的一个应用。 主函数不必考虑getMem3这个子函数是怎样实现的,这个思想很重要。 // 这个函数作用是,计算文件1和文件2的长度 // main()中的变量,不需要知道...
  • C语言二级指针的介绍和使用

    千次阅读 2017-02-24 16:02:58
    一、一级指针级指针的简单描述 ①一级指针是一种以存储其他变量地址为目的的变量。一个T类型的指针变量(一级指针)就是一个存储了某T类型值变量的内存地址的引用。 ②对指针的解引用(也就是*),是获取...
  • 1、说起指针之前,先来看看下面这个例子。 #include <stdio.h> #include <stdlib.h> int malloc_pointer(char *p) { if(p == NULL) { p = (char *)malloc(10); } return 0; } int free_pointer...
  • C语言二级指针用法

    2017-07-10 15:55:33
    二级指针的概念  首先任何值都有地址,一级指针的值虽然是地址,但这个地址做为一个值亦需要空间来存放,是空间就具有地址,这就是存放地址这一值的空间所具有的地址,二级指针就是为了获取这个地址,  一级...
  • 下面以二级指针为例说明二级指针正确的使用方法,以及错误使用二级指针的示例。 例如:需要一个string类型的二级指针给程序使用。 1. 只为一级指针分配内存 这种方法是只为一级指针分配内存,然后将一级指针的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 203,065
精华内容 81,226
关键字:

二级指针的应用