美文网首页
C++中指针与引用的区别

C++中指针与引用的区别

作者: 剑心折手 | 来源:发表于2023-11-08 17:24 被阅读0次

    Code 1:变量声明

        int a;
        cout << a << endl;     //result: 0
        cout << &a << endl;    //result: 0x61fe1c
        //cout << *a << endl;  //error, because a is not a pointer
    

    Result

    0
    0x61fe1c
    

    Description

    1. 访问基本类型的变量名,相当于访问value列。
        公式:a = (select value from LNT where name='a')
    2. 访问基本类型的&变量名,相当于访问pointer列,
        公式:&a = (select pointer from LNT where name='a')
    

    Memory datas tables

    pointer value
    0x61fe1c 0

    Logical names tables

    name type datatype pointer value
    a var int 0x61fe1c 0

    Code 2:变量定义

        int a = 2;
        cout << a << endl;    //result: 2
        cout << &a << endl;   //result: 0x61fe1c
        //cout << *a << endl; //error, because a is not a pointer
    

    Result

    2
    0x61fe1c
    

    Description

    1. 访问基本类型的变量名,相当于访问value列。
        公式:a = (select value from LNT where name='a')
    2. 访问基本类型的&变量名,相当于访问pointer列,
        公式:&a = (select pointer from LNT where name='a')
    

    Memory datas tables

    pointer value
    0x61fe1c 2

    Logical names tables

    name type datatype pointer value
    a var int 0x61fe1c 2

    Code 3:定义指针变量

        int a=999;
        int *p=&a;
        cout << a << endl;    //result: 999
        cout << &a << endl;   //result: 0x61fe1c
        //cout << *a << endl; //a不是指针,也不是非基本类型,error
        cout << p << endl;    //result: 0x61fe1c 
        cout << *p << endl;   //result: 999
        cout << &p << endl;   //result: 0x61fe10,在基本类型的访问中这个值意义不大,它代表指针的指针。
    

    result

    999
    0x61fe1c
    0x61fe1c
    999
    0x61fe10
    

    Description

    1. 访问基本类型的变量名,相当于访问value列。
        公式:a = (select value from LNT where name='a')
    2. 访问基本类型的&变量名,相当于访问pointer列,
        公式:&a = (select pointer from LNT where name='a')
    3. +访问基本类型的指针变量名,相当于访问value列。
        公式:p = (select value from LNT where name='p')
    4. +访问基本类型的*指针变量名,相当于指针为对应value值的value列
        公式:*p = (select value from LNT where pointer=(select value from where name='p'))
    5. +访问基本类型的&指针变量名,相当于访问pointer列
        公式:&p = (select pointer from LNT where name='p')
    

    Memory datas tables

    pointer value
    0x61fe1c 2
    0x61fe10 0x61fe1c

    Logical names tables

    name type datatype pointer value
    a var int 0x61fe1c 999
    p pointer int 0x61fe10 0x61fe1c


    Code 4:定义数组

        int a[]={1,2,3,4,4,5,6,7};
        cout << a << endl;      //result:0x61fe00
        cout << *a << endl;     //result:1
        cout << &a << endl;     //result:0x61fe00
        cout << a[0] << endl;   //result:1
        cout << &a[0] << endl;  //result:0x61fe00
        cout << a[3] << endl;   //result:4
        cout << &a[3] << endl;  //result:0x61fe0c
    

    result

    0x61fe00
    1
    0x61fe00
    1
    0x61fe00
    4
    0x61fe0c
    

    Description

        1. 数组名的本质为指针常量。非基本存储类型都是一个指针。
        2. 访问数组名,相当于访问value列。
            公式:a = (select value from LNT where name='a')
        3. 访问*数组名,相当于访问长子value值。
            公式:*a = (select value from LNT where name='a[0]' and pointer=(select value from LNT where name='a'))
        4. 访问&数组名,相当于访问pointer值。
            公式:&a = (select pointer from LNT where name='a')
        5. 访问数组名[index], 相当于访问value列
            公式:a[0] = select value from LNT where name='a[0]'
        6. 访问&数组名[index], 相当于访问pointer列
            公式:a[0] = select pointer from LNT where name='a[0]'
    

    Memory datas tables

    pointer value
    0x61fe00 1
    0x61fe04 2
    0x61fe08 3
    0x61fe12 4
    0x61fe16 5
    0x61fe20 6
    0x61fe24 7

    Logical names tables

    name type datatype pointer value
    a pointer int[] 0x61fe00 0x61fe00
    a[0] var int 0x61fe00 1
    a[1] var int 0x61fe04 2
    a[2] var int 0x61fe08 3
    a[3] var int 0x61fe12 4
    a[4] var int 0x61fe16 5
    a[5] var int 0x61fe20 6
    a[6] var int 0x61fe24 7

    Code 5:二维数组

        int a[2][3]={{1,2,3},{4,5,6}};
        cout << a << endl;       //result:0x61fe00
        cout << *a << endl;      //result:0x61fe00
        cout << **a << endl;     //result:1
        cout << &a << endl;      //result:0x61fe00
        cout << a[1] << endl;    //result:0x61fe0c
        cout << &a[1] << endl;   //result:0x61fe0c
        cout << *a[1] << endl;   //result:4    
    

    result

    0x61fe00
    0x61fe00
    1
    0x61fe00
    0x61fe0c
    0x61fe0c
    4
    

    Description

        1. 二维数组名实为二维指针常量。
        2. 访问二维数组名,相当于访问value列。
            公式:a = (select value from LNT where name='a')
        3. 访问*二维数组名,相当于访问长子value值。
            公式:*a = (select value from LNT where name='a[0]' and pointer=(select value from LNT where name='a'))
        3. 访问**二维数组名,相当于访问长孙value值。
            公式:**a = (select value from LNT where name='a[0][0]' and pointer=(select value from LNT where name='a'))
        4. 访问&二维数组名,相当于访问pointer值。
            公式:&a = (select pointer from LNT where name='a')
    
    

    emory datas tables

    pointer value
    0x61fe00 1
    0x61fe04 2
    0x61fe08 3
    0x61fe12 4
    0x61fe16 5
    0x61fe20 6

    Logical names tables

    name type datatype pointer value
    a pointer int[][] 0x61fe00 0x61fe00
    a[0] pointer int[] 0x61fe00 0x61fe00
    a[0][0] var int 0x61fe00 1
    a[0][1] var int 0x61fe04 2
    a[0][2] var int 0x61fe08 3
    a[1] pointer int[] 0x61fe12 0x61fe12
    a[1][0] var int 0x61fe12 4
    a[1][1] var int 0x61fe16 5
    a[1][2] var int 0x61fe20 6

    Code 6:字符串定义

        char a[]="1234567890";
        cout << a << endl;       //result: 1234567890
        cout << &a << endl;      //result: 0x61fe00
        cout << *a << endl;      //result: 1
        cout << &*a << endl;     //result: 1234567890
        cout << *&a << endl;     //result: 1234567890
        cout << str51[3] << endl;//result: 4
        //cout << *str51[3] << endl; //error, because str51[3] is not a pointer but a prime value.
        cout << &str51[3] << endl;//result:4567890     
    

    result

    1234567890
    0x61fe00
    1
    1234567890
    1234567890
    4
    4567890
    

    Description

        1. 字符串名实为字符数组变量名,本质是一个指针常量。
    (注意)除了&字符串名,可以访问到指针,其余的a, a[index],&a[index]所代表的指针变量皆是提供字符串形式。
        2. 访问字符串名,本该显示value值为一个指针,但因字符串特征,并未返回内存地址,而是直接访问字符串,读此指针后的所有字符,直到size完成,或者遇到\0。
            公式:a = (select concat(value) from LNT where name like 'a[%]')
        3. 访问*a字符串名,访问了第一个字符,相当于访问长子value列。
            公式:*a = (select value from LNT where name='a[0]' and pointer=(select value from LNT where name='a'))
        3. 访问&字符串名,相当于pointer列。
            公式:&a = (select pointer from LNT where name='a')
        4. 访问&字符串名[index],本该显示pointer列,但字符串特征,并未返回内存地址,而是直接访问字符串,读此地址的所有字符串,直到size完成,或者遇到\0。
            公式:&a[index] = ...
    
    

    emory datas tables

    pointer value
    0x61fe00 '1'
    0x61fe01 '2'
    0x61fe02 '3'
    0x61fe03 '4'
    0x61fe04 '5'
    0x61fe05 '6'
    0x61fe06 '7'
    0x61fe07 '8'
    0x61fe08 '9'

    Logical names tables

    name type datatype pointer value
    a pointer char[] 0x61fe00 0x61fe00
    a[0] var char 0x61fe00 1
    a[1] var char 0x61fe01 2
    a[2] var char 0x61fe02 3
    a[3] var char 0x61fe03 4
    a[4] var char 0x61fe04 5
    a[5] var char 0x61fe05 6
    a[6] var char 0x61fe06 6
    a[7] var char 0x61fe07 6
    a[8] var char 0x61fe08 6

    相关文章

      网友评论

          本文标题:C++中指针与引用的区别

          本文链接:https://www.haomeiwen.com/subject/jsvqwdtx.html