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

2023-11-08  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读