我在一个指针中有5个数字
int* reversevec(int* ptr, unsigned int Ne){
int* ReverResult;
unsigned int rever=Ne, z;
ReverResult=(int*)malloc(Ne*sizeof(int));
for (int i = 0; i < Ne; ++i)
{
z=*(ptr+rever);
printf("%i ",z);//to be sure z starts from the last number on ptr to the fisrt
rever--;
}
return ReverResult;
}
示例元素数量(Ne)=5
int*ptr有5个数字{1 2 3 4 5}
每次打印z时,我都会得到{5 4 3 2 1}
但我无法将z保存到*ReverResult 中
ReverResult=(z+rever);
这一行是我试图放入cicle for中的内容,以将z和位置保存到int指针ReverResult中,但我无法将int转换为int*;
这里有很多问题
z
是一个局部变量int。返回它的地址将没有用处,因为它将超出范围。从其地址返回偏移量更糟糕,因为这在内存中是一个完全无关的位置。
你也有一个错误。想象数字元素是一。然后,您将尝试查看ptr+1而不是ptr+0。
您也标记了这个c++,但正在编写c风格的代码。
为了回答您的主要问题,与其写ReverResult=(z+rever)
,不如写*(ReverResult + rever - 1) = *(ptr + i)
反之,您需要取消引用指针才能进行赋值。毕竟,使用纯指针算法会更容易:
int* result = malloc(sizeof(*ptr) * ne);
// let's just have to pointers running through the two arrays:
for(int* p = ptr + ne, *r = result; p-- != ptr; ++r)
{
*r = *p;
// ^ ^ this is the important part: dereference both pointers
}
如果您仍然喜欢索引,可以使用operator[]
:
--ne; // so that we don't have to subtract within the loop again and again
for(size_t index = 0; index <= ne; ++index)
{
result[index] = ptr[ne - index];
// ^^^^^^^ again: dereferencing, this time with offset
}
array[index]
完全等同于*(array + index)
,实际上它也等同于index[array]
(例如7[array]
),后者经常被用来愚弄没有经验的人。。。