双重指针

转载http://www.diybl.com/course/3_program/c++/cppjs/2008426/111630.html
双重指针」也有人称为「指针的指针」,其作用为「间接参照」,但无论是哪一个名词,都是令人困惑的,其实指针就是指针,所谓的多重指针,其实还是指针,它们的作用单纯来说,都是用以储存记忆体位址。
正在装载数据……


思考一个问题,当您要取得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 
 


-
欢迎光临DIY部落,收藏本篇文章   【点击打包该文章】
[1] [2]
文章出处:http://www.diybl.com/course/3_program/c++/cppjs/2008426/111630.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值