【C++指针偏移问题】

学习记录:

练习选择排序遇到的指针偏移超出数组元素个数问题。
定义指针时:int *p1 = (int *)(a+1) 与int *p2(int *)(&a+1)不同。
如果是一维数组,后者会指向未知内存单元,显示错误。


问题描述

数组首地址偏移a+1与&a+1效果不同,前者是指针指向数组中下一元素(数组元素地址指针),后者是指向下一数组(数组指针)

//数组元素偏移
int main()
{    
    int a[]={5,5,8,4,6,9,3};
    int *p1=a;
    int *p2=(int *)(a+1);
    cout<<"p1="<<p1<<endl<<"*p1="<<*p1<<endl<<"p2="<<p2<<endl<<"*p2="<<*p2<<endl;
    int len=sizeof(a)/sizeof(a[0]); 
    Mysort sor;
    sor.Dosort(a,len);
    return 0;
}
//结果
p1=0x61fdf0
*p1=5
p2=0x61fdf4
*p2=5
排序结果:
9 8 6 5 5 4 3

//数组指针偏移
int main()
{    
    int a[]={5,5,8,4,6,9,3};
    int *p1=a;
    int *p2=(int *)(&a+1);
    cout<<"p1="<<p1<<endl<<"*p1="<<*p1<<endl<<"p2="<<p2<<endl<<"*p2="<<*p2<<endl;
    int len=sizeof(a)/sizeof(a[0]); 
    Mysort sor;
    sor.Dosort(a,len);
    return 0;
}
p1=0x61fdf0
*p1=5
p2=0x61fe0c
*p2=0
排序结果:
9 8 6 5 5 4 3

原因分析:

(int *)(a+1) 元素指针 , (int *)(&a+1)地址指针
第一种情况可看到地址偏移量为4,第二个地址偏移量为28

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面列举几道 C++ 指针面试题供参考。 1. 指针和引用有什么区别? 指针和引用都可以用来访问内存中的变量,但是它们有以下几点区别: - 指针可以被赋值为 `nullptr`,而引用不行。 - 指针可以在运行时指向不同的变量,而引用在声明时就必须绑定到一个变量上,并且不能更改绑定的变量。 - 指针可以进行算术运算和解引用操作,而引用不能。 - 指针可以被重新赋值为指向不同类型的变量,而引用必须与原始变量类型匹配。 2. 指针和数组有什么关系? 指针和数组有着紧密的关系,因为数组名其实就是数组首元素的地址。例如,下面的代码定义了一个数组并初始化: ```c++ int arr[] = {1, 2, 3, 4, 5}; ``` 可以通过下标访问数组元素,也可以通过指针访问数组元素。例如,下面的代码使用指针访问数组元素: ```c++ int* p = arr; for (int i = 0; i < 5; i++) { cout << *(p + i) << " "; } ``` 这里的 `p` 是一个指向 `int` 类型的指针,它指向数组 `arr` 的首元素。在循环中,我们通过指针访问数组元素,其中 `*(p + i)` 表示指针 `p` 加上 `i` 个偏移量后所指向的元素。 3. 如何避免空指针引用? 空指针引用是一种常见的程序错误,可以通过以下几种方式避免: - 在使用指针之前,先将其初始化为 `nullptr`。 - 在使用指针之前,先进行空指针判断。 - 使用智能指针,可以自动管理指针的生命周期,并且可以避免空指针引用。 例如,下面的代码演示了如何进行空指针判断: ```c++ int* p = nullptr; if (p != nullptr) { *p = 10; } ``` 在这个示例代码中,我们先将指针 `p` 初始化为 `nullptr`,然后在使用指针之前,先进行空指针判断。由于 `p` 是空指针,所以不会执行赋值操作,从而避免了空指针引用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值