C++编程简单问题指针运算

来源:百度知道 编辑:UC知道 时间:2024/09/28 08:10:33
指针运算!!!
typedef double* DoublePtr;
DoublePtr d;
d=new double[10];
我看书上说可以对这个数组采取这个操作
for(int i=0;i<array_size;i++)
cout<<*(d+1)<<"";
d包含索引变量a[0]的地址,d+1就是d[1]的地址!!!
于是我自己写了一个程序
#include<iostream>

using namespace std;

int main()
{
int *p;
int a1;
p=&a1

*(p+1)=2;
cout<<*(p+1);
return 0;
}很遗憾是错误的, 既然p包含a1的地址 为什么P+1不能是P下面一个内存位置的地址!!!!!!

请高手解答

你给出的例子是申请了一个动态内存的数组,所以可以用指针的移动来输出下一个数,这样是合法的。
而你自己写的程序中,定义的a1是一个数,而不是数组,p指向整型数a1。
而p+1,我要说,这个语句确实指向了p下面一个内存位置的地址,但是,因为p+1没有向系统申请过,对它的调用是非法的,运气好的话也许运行起来也不会出错,可以看到p+1位置的用int数据类型解释的内容。不过这样毕竟是不安全的,也不是好习惯。最好像上面的兄弟说的那样用数组,或者申请动态内存。

上面那个d是指向double数组的指针,d包含索引变量a[0]的地址,d+1就是d[1]的地址!!!

你的程序p指向a1而不是数组,p+1是个a1地址的下一个地址,当然报错了。。

你这个程序的问题是访问了未分配的内存。你定义了一块内存来存放a1,但是你想操作a1后面的一块内存,a1是分配在stack中的,而其后那一块内存可能另有别用,也可能根本还没分配,仅有个地址而已,你去操作它,要么当场会引起错误,要么运行到某个时候突然出错,当然也可能一直没问题。这都是不确定的。
如果你真想试试,建议你定义这样的a1:
int a1[2];
这样你就可以操作a1后的内存了。

p是a1的内存地址,但是p+1这个内存区域你并没有声明啊,直接使用会导致访问越界。

#include<iostream>

using namespace std;

int main()
{
int *p;
int a1,a2;
p=&a1

*(p+1)=2;
cout<<*(p+1);
return 0;
}

继续给个例子吧。呵呵。
由于a1,a2是连续的内存,*(p+1)就指向a2了。这样你的程序是可以正常运行的。当然最好对使用的变量初始化,不能依靠编译器,否则可能出现很多意想不到的结果。