精华内容
下载资源
问答
  • 双重指针

    2019-10-01 16:23:53
    双重指针」也有人称为「指针的指针」,其作用为「间接参照」,但无论是哪一个名词,都是令人困惑的,其实指针就是指针,所谓的多重指针,其实还是指针,它们的作用单纯来说,都是用以储存记忆体位址。思考一个问题,...

    双重指针」也有人称为「指针的指针」,其作用为「间接参照」,但无论是哪一个名词,都是令人困惑的,其实指针就是指针,所谓的多重指针,其实还是指针,它们的作用单纯来说,都是用以储存记忆体位址。 

    思考一个问题,当您要取得int变数的记忆体位址时,会使用int*来宣告指针,要取得double变数的记忆体位址时,会使用double*来宣告指针,这是因为它们在进行加减法运算时,所位移的单位并不相同,而是根据它们的资料型态而定,而如果您只是要储存一个记忆体位址,您就宣告指针为void* 型态。 

    指针可以用来储存(某变数的)记忆体位址,所以指针本身就是一个变数,也要占有记忆体空间才能储存资讯,那么指针的记忆体空间位址在哪呢?同样的使用 &运算子就可以得知了,例如:

    #include <iostream> 
    using namespace std; 

    int main() {
        int p = 10; 
        int *ptr = &p; 

        cout << "p的值:
    " << p 
             << endl; 
        cout << "p的记忆体位置
    : " << &p 
             << endl;
        cout << "*ptr参照的值
    : " << *ptr 
             << endl; 
     
        cout << "ptr储存的位址值
    : " << ptr 
             << endl; 
        cout << "ptr的记忆体位置
    : " << &ptr 
             << endl; 
     
        return 0; 
    }

    执行结果:

    p的值:10
    p
    的记忆体位置
    : 0x22ff74
    *ptr
    参照的值
    : 10
    ptr
    储存的位址值
    : 0x22ff74
    ptr
    的记忆体位置: 0x22ff70

     

    由以上的范例,您知道ptr在记忆体中的0x22ff70占据空间,并储存了0x22ff74这个值,0x22ff74也就是p在记忆体中的位置,该位置储存了10这个值。 

    如果在上例中,您要储存ptr的记忆体位址,也就是0x22ff70这个值,那么如何作?由于ptr是个int*型态变数,如同int变数必须宣告 int*指针,所以int*型态变数就必须宣告int**型态的指针,例如:
    int **ptr2 = &ptr;

    下面这个程式可得仔细看看:
    #include <iostream> 
    using namespace std; 

    int main() {
        int p = 10; 
        int *ptr1 = &p; 
        int **ptr2 = &ptr1; 

        cout << "p的值:
    " << p << endl; 
        cout << "p的记忆体位置
    : " << &p << endl; 

        cout << endl;

        cout << "*ptr1 = " << *ptr1 << endl; 
        cout << "ptr1 = " << ptr1 << endl; 
        cout << "ptr1的记忆体位置
    : " << &ptr1 << endl; 

        cout << endl;
     
        cout << "**ptr2 = " << **ptr2 << endl; 
        cout << "*ptr2 = " << *ptr2 << endl; 
        cout << "ptr2 = " << ptr2 << endl; 

        cout << endl;
     
        cout << "整理(谁储存了谁?):
    " << endl; 
        cout << "&p = " << &p << "/t/t" << "ptr1 = " << ptr1 << endl; 
        cout << "&ptr1 = " << &ptr1 << "/t" 
             << "ptr2 = " << ptr2 
             << endl;
     
        return 0; 
    }

    执行结果:

    p的值:10
    p
    的记忆体位置
    : 0x22ff74

    *ptr1 = 10
    ptr1 = 0x22ff74
    ptr1
    的记忆体位置
    : 0x22ff70

    **ptr2 = 10
    *ptr2 = 0x22ff74
    ptr2 = 0x22ff70

    整理(谁储存了谁?)

    &p = 0x22ff74           ptr1 = 0x22ff74
    &ptr1 = 0x22ff70        ptr2 = 0x22ff70

     

    在执行结果中,您可以看到最后的整理中,ptr1储存了p变数所占有的位址,而ptr2则储存了ptr1所占有的位址,所以当您使用*取值运算子时, *ptr2取出的是ptr1所储存的值,也就是&p,而再使用一次*运算子时,也就是**ptr2时,因为*ptr2 == ptr1,所以*(*ptr2 ) == *ptr1,而*ptr1 == p,所以也就是取出了p的值了。

    转载于:https://www.cnblogs.com/xiatian1071/p/3567401.html

    展开全文
  • 如何使用双重指针

    千次阅读 2016-03-28 10:12:56
    双重指针的使用 单重指针已经够蛋疼了,c语言中还引入了双重指针,甚至若干重指针。使得这个情况变得更加复杂。虽然以前一直觉得双重指针也不过如此,指针的指针嘛,还不是照样理解,但是上一次重删代码中,...
    双重指针的使用

    单重指针已经够蛋疼了,c语言中还引入了双重指针,甚至若干重指针。使得这个情况变得更加复杂。虽然以前一直觉得双重指针也不过如此,指针的指针嘛,还不是照样理解,但是上一次重删代码中,因为管理海量数据,引入了大量的指针操作,并且为了函数封装,采用了指针作为参数来传递。因此出现了较多问题,现在感觉很有必要写一篇有关双重指针的博文。

    先看一个例子:

    程序1

    void change(char* p) 

    {

        p = "bbb";

    }

    int main(int argc, char* argv[])

    {

        char *v = "aaa";

        change(v);

        printf("%s",v);

        return 0;

    }

     
     

    我们发现输出的结果仍然是aaa。

     

    对它进行修改:

    程序2

    void change(char** p)

    {

        *p = "bbb";

    }

     

    int main(int argc, char* argv[])

    {

        char *v = "aaa";

        change(&v);

       printf("%s",v);    

       return 0;

    }

     
     

    此时输出的结果为bbb.

     

    分析:

    出现以上现象的原因是因为这个函数调用的时候,这个指针作为参数传递问题。程序1中,实际上,当我们调用函数change,把指针char*v,当做参数传入的时候,这里还隐藏了一个赋值的操作,也就是说,传入到change函数中的是另外某个参数char* x,x=v;所以说最后改变的只不过是x,v指向的东西并没有改变,所以输出来,还是aaa。如下图所示:

    如何理解双重指针 - 黄绿红 - 民富国强的博客

     

    在程序2,操作过程中,指针v本身的地址值始终没有改变,改变的是指针v所指向的地址变化了。它不再指向”aaa”所在的地址,而是”bbb”所在的地址。如下图所示:

     

    如何理解双重指针 - 黄绿红 - 民富国强的博客

     

    总结:当指针作为函数参数传递的时候,如果想改变指针所指向的地址,比如想把char*v,从指向“aaa”转到指向“bbb”,那么需要采用双重指针传递的方式。或者说想通过调用函数的方式,给指针用malloc 分配新的地址的时候,也需要采用双重指针,才能实现真正的分配,否则是分配不成功的。

    而如果只是想改变,指针所指向的地址里面的内容的时候,则采用单重指针就可以了,比如想把“aaa”改成“aab”,那么直接用单重指针传递就ok了,因为指针指向的地址不需要改变。代码就应该写成,如下:

    程序3

    void change(char* p) 

    {

        *(p+2) = 'b';

    }

    int main(int argc, char* argv[])

    {

        char *v = "aaa";

        change(v);

        printf("%s",v);

        return 0;

    }

    如下图:
      
    如何理解双重指针 - 黄绿红 - 民富国强的博客
     


    展开全文
  • 双重指针和三重指针的作用?

    千次阅读 2019-08-13 15:48:41
    双重指针 指向指针的指针 **p指向指针的地址*p数值 double **feature; //用于存储矩阵转置乘法 用来传递需要修改的指针参数到函数中。 用来动态生成多维数组。 大多用在需要函数改变指针(重新引用变量)而又不能...

    双重指针 指向指针的指针 **p指向指针的地址*p数值

    double **feature;

    //用于存储矩阵转置乘法

    用来传递需要修改的指针参数到函数中。
    用来动态生成多维数组。

    大多用在需要函数改变指针(重新引用变量)而又不能通过返回值传递(例如返回值用于传递其他结果)时。

    如果不用双重指针形参改变了实参不会改变

    为了解决这个问题才需要用到双重指针

    **p=&a

    **p的地址等于a的地址

    说明*p等于a

    (地址与取值的对应关系,地址一样那值肯定一样,毕竟就这两个东西不可能两个不同地址指向同一个值)

    指向同一个值的地址一定相同吗?

    同一个地址对应的值相同

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 双重指针的用法

    千次阅读 多人点赞 2018-09-20 22:11:39
    2、指针一直都是C语言的灵魂,我们平常用得最多的是一维指针,而双重指针用得相对较少,本文是对二维指针进行一个学习。 首先看一道习题: char GetMemory(char *memorystr,u8 num) { memorystr = (char*)malloc...

    前言 
    1、本人QQ – 330952038 欢迎一起学习交流。 
    2、指针一直都是C语言的灵魂,我们平常用得最多的是一维指针,而双重指针用得相对较少,本文是对二维指针进行一个学习。

    首先看一道习题:

    char GetMemory(char *memorystr,u8 num)
    {
        memorystr = (char*)malloc(num);
    }
    
    int main(void)
    {
        char *str = NULL;
        GetMemory(str,6);
        memcpy(str,"china",5);
    } 

    请问上面代码,可以为str开辟一个空间并且把”china” 拷贝到其中吗? 
    分析: 
    要了解这个问题,我们需要先了解函数调用的过程: 
    1)首先把实参的值赋给形参,然后把控制流转到被调用函数。 
    2)执行被调用函数。 
    注意形参改变是不会影响到实参的值。我们再分析GetMemory(str,6),实参是一个空指针str,形参为memorystr,调用时,把str赋给memorystr,然后执行memorystr = (char*)malloc(num);,这时候 memorystr获得了6个char空间,但是因为形参改变不会影响到实参的值,str的值并没改变,还是NULL,所以上面拷贝不成功。 
    我们根据下图来说明: 
    这里写图片描述

    ps: 我们平常使用指针把参数从函数中传递出来,传递的是指针所指向的内容,而非指针本身,而上的例子企图改变的是指针本身。

    如果例子想达到目的,该怎么改呢? 我们可以使用双重指针实现。所谓双重指针,也称为二维指针,声明形式 
    类型名 **指针名, eg: char **p, 含义是指向指针的指针。 
    如下图: 
    这里写图片描述 
    char **p = “123”: 
    1)首先申请了一个空间,我们假设地址为a,a地址内容是p,p是一个二级指针,指向以p为地址的空间,则其内容为*p。 
    2)*p时一个一级指针,指向以*p为地址的空间,该空间存储的是”123” 
    3)引用二级指针,修改*p 的值就可以改变二级指针(**p)所指向的地址。通过函数参数形式修改指针地址,一般使用二级指针。 
    eg: 
    char **p =”123” , *a = “456”; *p = a; 这时候,**p指向的内容是“456”

    根据这些知识,我们修改上面的例程,以实现其功能:

    char GetMemory(char **memorystr,u8 num)// 使用二级指针
    {
        *memorystr = (char*)malloc(num);// 这里是赋值给*memorystr 
    }
    
    int main(void)
    {
        char *str = NULL;
        GetMemory(&str,6);// 取str的地址
        memcpy(str,"china",5);
    } 

    分析: 
    1、GetMemory(&str,6);// 取str的地址,赋给了二级指针memorystr, 那么*memorystr就是取&str地址的内容,即str,两者完全等价。如果*memorystr改变,那么str也会改变。

    2、*memorystr = (char*)malloc(num);// 申请num个char空间给*memorystr,也就是给str申请了num个char空间。

    3、最后把字符串copy到china 中。

    程序员学习公众号:

    展开全文
  • 如何理解双重指针

    千次阅读 2015-07-24 08:10:23
    单重指针已经够蛋疼了,c语言中还引入了双重指针,甚至若干重指针。使得这个情况变得更加复杂。虽然以前一直觉得双重指针也不过如此,指针的指针嘛,还不是照样理解,但是上一次重删代码中,因为管理海量数据,引入...
  • C语言的指针详解,单指针,双重指针(char *和char **)

    千次阅读 多人点赞 2018-12-07 14:18:04
    char ** 定义的是一个双重指针 让我困惑的也就是双重指针 下面的图解释一下 指针变量地址双重指针1指针2地址变量地址 对于定义的单指针变量&amp;quot; p1 &amp;quot;里的值是变量 &amp;quot; ...
  • 双重指针的使用

    2016-12-19 10:30:29
    单重指针已经够蛋疼了,C语言中还引入了双重指针,甚至若干重指针。使得这个情况变得更加复杂。虽然以前一直觉得双重指针也不过如此,指针的指针嘛,还不是照样理解,但是上一次重删代码中,因为管理海量数据,引入...
  • 双重指针赋值

    千次阅读 2019-03-17 20:49:55
    int *p; p=(int *)mallloc(sizeof(int)*len); *p=1;//p[0]=1 ...二:双重指针赋值 bool **p; p=(bool**)malloc(sizeof(bool*)); cout<<"input array"<<endl; for(int i=0;i<m;...
  • 二维数组和双重指针

    2021-02-04 14:43:25
    二维数组和双重指针 int a[3][4]; int **p; 如上是一个二维数组和一个双重指针,在普遍情况大多数人认为二维数组名a是可用一个双重指针来指向的,但是实际情况中这么做无法通过编译器。 为了弄清这么个问题,我们对...
  • 只考虑指针就够绕人了,双重指针更难理解。为了弄懂到底它们的实际意义是什么,写了个小片段,把各种使用指针的可能都了解一遍,仅供娱乐。 本人使用Archlinux+gcc, 代码如下: #include <stdio.h> int ...
  • 理解双重指针

    2015-04-09 14:52:16
    双重指针好的是在函数调用时可以改变指针的指向,而单指针通过函数调用只能改变指针所指地址的内容,不能改变指针的指向 代码如下,有空写详解:#include <stdio.h>int main(void) { void swap1(int *a,int *b); ...
  • 关于双重指针的用法

    2015-01-17 14:46:40
    一直以为双重指针也就是指向指针的指针而已,不过是存储了地址,也没什么其他特点。也从来没有使用过双重指针,觉得一重指针就够用了。可是在学数据结构——树,写的程序突然用指针作形参却怎么也传不回来值,这和我...
  • 双重指针:  指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的...
  • C语言之二级指针/双重指针

    千次阅读 2015-04-11 18:08:52
    C语言之二级指针/双重指针 首先,回顾字符串与指针的关系,声明如下: char *string="Hello!"; char string[]="Hello!"; 复杂声明解释方法:
  • 你要想用一个指针指向这个多维数组的话那就需要一个双重指针int **p=a;   int* a[2]:指针数组 int (*a)[2]:数组指针 //////////////////////////////////////////////////// int a[2]:a是一个数组名 int (*a)[2]:a...
  • 这个题为什么最后不输出hoe are you 呢

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,262
精华内容 8,104
关键字:

双重指针