C++备忘录(2)地址运算

2 篇文章 0 订阅

运行环境:cc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 64位机器
首先看一段代码

{   
    const char *p1 = "hello";
    const char *p2 = "hello";                                                                                                                                                                              
       
    cout << &p2 - &p1 << endl;
    return 0;
}   

在这里插入图片描述
因为p1和p2是连续的两个栈上的变量,它们的地址是相邻的。
p2的地址减去p1的地址,其值等于两个地址偏移了多少个元素,或是间隔多少个同类型个数。
因此上面运行结果为1

但是发现了一个问题:
我们再看一段代码证明:

{                                    
    const char *p1 = "h1";           
    const char *p2 = "h2";           
    const char *p3 = "h3";           
    const char *p4 = "h4";           

/*                                                         
    cout << &p1 << endl;             
    cout << &p2 << endl;             
    cout << &p3 << endl;             
    cout << &p4 << endl;             
*/                               
    cout << &p4 - &p1 << endl;       
                                                                                                                                                                                                           
    return 0;                        
} 

我的本意是想得到3,但是,结果却仍然是1。只有打开注释部分,结果才是3。不确定是否跟编译器有关,还是C++本身是这样设计的。
为了方便起见(跳过这个问题)我们用数组继续做测试:

{       
    int ptr[3]{1, 2, 3}; 
        
    cout << ptr << endl;
    cout << &ptr[0] << endl;
    cout << &ptr << endl << endl;
        
    cout << ptr + 1 << endl;
    cout << &ptr[1] << endl;
    cout << &ptr[0] + 1 << endl << endl;                                                                                                                                                                   
        
    cout << &ptr + 1 << endl;
        
    return 0;
}  
我们应该知道:
  1. int类型长度为4字节
  2. 数组名为首元素地址,数组名+N等于第N+1个元素的地址(就是下标后移N位)
  3. 对数组名取地址取的才是整个数组的地址
运行结果:
0x7fffb278988c
0x7fffb278988c
0x7fffb278988c

0x7fffb2789890
0x7fffb2789890
0x7fffb2789890

0x7fffb2789898
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值