无法增加char *指针

时间:2016-04-13 21:23:55

标签: c++

我的指针有点生锈,所以请耐心等待。我已经声明了一个字符数组和一个char *指针,它按以下方式设置:

char* memPointer = &mem_arr[0]; 

当我运行程序时,看起来我的起始地址是6E2D200C(由于某种原因,这个地址总是相同的。我不确定这是否正确。如果我正在做某事,请告诉我错误) 然后,在用户请求某些内存的某个时刻,我尝试增加指针并打印出新地址。但地址与上面提到的相同。以下是我尝试过但没有成功的事情:

//*(memPointer += actualSize); //no change
//memPointer += actualSize; //no change
//*memPointer += actualSize;// no change
&memPointer += actualSize; //no change
顺便说一句,

actualSize是一个int。如果我需要提供任何其他信息,请告诉我。提前谢谢!

3 个答案:

答案 0 :(得分:3)

指针的地址不会改变,但如果你开始递增它,指针可能会指向别的东西:

char* x = "test";
// *x is now 't'

x++;
// *x is now 'e'

除非您使用指针指向char** x,否则没有有意义的方法来操纵指针本身的地址。

关于"当用户请求某些内存时#34;并暗示你必须操纵指针似乎是基于有缺陷的假设。如果你正在使用这种C风格,你可以使用realloc()来获得指向新分配的指针。如果你正确地使用C ++,那么你需要new一些新内存,复制内容,然后delete旧分配。

答案 1 :(得分:3)

在您的评论中,您表明您的代码符合以下要求:

char mem_arr[] = "hello world";
char* memPointer = &mem_arr[0];
memPointer += actualSize;
printf("memPointer = %p\n", &memPointer);

这一行

char* memPointer = &mem_arr[0];

说:假设有一个名为char*的{​​{1}}类型的变量,并让它包含 mem_arr 的第一个元素的地址。在此行之后,变量memPointer 包含 memPointer的地址。

mem_arr[0]扩展为地址 - memPointer,而不是memPointer包含的地址。 memPointer是一个命名变量,并且&memPointer计算该变量的地址 - 内存中的位置 - 而不是它的值。

&memPointer

会将memPointer设置为指向mem_arr的 actualSize 元素,因为您的代码似乎正在尝试这样做。

答案 2 :(得分:1)

也许您对获取 mempointer 的地址感到困惑,而不是 mempointer指向的地址

此代码显示my_pointer指向的地址如何随着我增加指针或我给他一个新的内存地址而改变,看看:

int mem_arr[256];
int * my_pointer = &mem_arr[0];

// let's give some values to the array just
// for fun
for(int i = 0; i < 256; i++)
{
    mem_arr[i] = 10 + (i * 10);
}

// print original value & address
std::cout << "Value 1: " << *my_pointer << " Address 1: " << my_pointer << std::endl;

// increase pointer (+4 bytes)
my_pointer++;

// print current value & address
std::cout << "Value 2: " << *my_pointer << " Address 2: " << my_pointer << std::endl;

// let's seek into the 8th element
// of the array
my_pointer = &mem_arr[8];

// and print current value & address once again
std::cout << "Value 3: " << *my_pointer << " Address 3: " << my_pointer << std::endl;

getchar();

my_pointer

本身返回my_pointer指向的地址,而

&my_pointer

返回存储指针my_pointer的地址