学习记录:
练习选择排序遇到的指针偏移超出数组元素个数问题。
定义指针时: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