C++ C++;指针到指针

C++ C++;指针到指针,c++,pointers,constants,C++,Pointers,Constants,我希望有一个指向常数的指针,并将其地址传递给一个将递增它的函数 int f1(const int **ptr) { int n = **ptr; //use pointer (*ptr)++; //increment pointer return n; } void foo(const int *data) { const int *p = data; const int n = f1(&p); //error: invalid conversi

我希望有一个指向常数的指针,并将其地址传递给一个将递增它的函数

int f1(const int **ptr) {
    int n = **ptr; //use pointer
    (*ptr)++; //increment pointer
    return n;
}

void foo(const int *data) {
    const int *p = data;
    const int n = f1(&p); //error: invalid conversion from ‘const int**’ to ‘int**’
                          //error:   initializing argument 1 of ‘int LevelLoader::readWord(byte**)’


}
如何声明指针?

这是:

const int *data;
是指向常量整数的指针。这意味着不允许您更改
data
指向的数据。您可以读取和复制数据,但不能执行以下操作:

(*data) = 5;

这是C++中非法的,因为它被声明为代码> const int */COD> 如果您获取一个

const int*
的地址,您将得到一个
const int**
,它是指向常量整数的指针。所以您仍然无法更改整数。任何这样做的尝试都会导致编译器抱怨

如果希望能够更改整数,则
foo
f1
不应采用
const int*
值。它们应该取
int*


我不想修改常数。我想修改指向它的指针(foo()中的p)

所以,给你一个指针。你想增加指针。那么就这么做吧:

void foo(const int *data) {
    const int *p = data;
    data++;
}
您已经增加了指针。这不会影响调用
foo
,因为指针本身是按值复制的。

这:

const int *data;
是指向常量整数的指针。这意味着不允许您更改
data
指向的数据。您可以读取和复制数据,但不能执行以下操作:

(*data) = 5;

这是C++中非法的,因为它被声明为代码> const int */COD> 如果您获取一个

const int*
的地址,您将得到一个
const int**
,它是指向常量整数的指针。所以您仍然无法更改整数。任何这样做的尝试都会导致编译器抱怨

如果希望能够更改整数,则
foo
f1
不应采用
const int*
值。它们应该取
int*


我不想修改常数。我想修改指向它的指针(foo()中的p)

所以,给你一个指针。你想增加指针。那么就这么做吧:

void foo(const int *data) {
    const int *p = data;
    data++;
}

您已经增加了指针。这不会影响调用
foo
,因为指针本身是按值复制的。

再次检查,此代码是正确的。它不应该产生你声称的错误


编辑:您修复了无效问题,因此相应地修改了答案。

再次检查,此代码是正确的。它不应该产生你声称的错误

编辑:您修复了无效问题,因此相应地修改了答案。

试试看

int f1(const int *& ptr) {
  int n = *ptr;
  ++ptr; 
  return n;
}

void foo(const int *data) {
  const int *p = data;
  const int n = f1(p); 
}
相反

错误消息表明
LevelLoader::readWord
没有使用
常量字节**

重试

int f1(const int *& ptr) {
  int n = *ptr;
  ++ptr; 
  return n;
}

void foo(const int *data) {
  const int *p = data;
  const int n = f1(p); 
}
相反



错误消息表明
LevelLoader::readWord
不接受
常量字节**

为什么要更改常量?此外,您可能想考虑使用引用,为什么当代码< >空> <代码>时,您将代码< > f1 < /代码>的返回值分配给<代码> n>代码>?它应该返回nI,因为nI不能重现这些错误。您使用的是哪种编译器?我在VC2008中编译了您的代码的编辑版本,它编译得很好。考虑到你的错误提到了你没有向我们展示的东西(什么是“LevelLoader::readWord”,为什么你没有在你的问题中发布它),我建议发布实际代码,而不是它的副本。你为什么要更改常量?此外,您可能想考虑使用引用,为什么当代码< >空> <代码>时,您将代码< > f1 < /代码>的返回值分配给<代码> n>代码>?它应该返回nI,因为nI不能重现这些错误。您使用的是哪种编译器?我在VC2008中编译了您的代码的编辑版本,它编译得很好。考虑到你的错误提到了你没有向我们展示的东西(什么是“LevelLoader::readWord”,为什么你没有在你的问题中发布它),我建议发布实际的代码,而不是它的副本。我想在f1()函数中增加它,所以我需要传递指针的地址?他没有试图修改常量int,只是修改指针。我想在f1()中递增到指针,所以我需要传递它的地址我想在f1()函数中递增它,所以我需要传递指针的地址?他没有试图修改常量int,只是修改指针。我想在f1()中递增到指针,所以我需要传递它的值address@richb:当我写它时,
f1
的类型是
void
。经过修正后,它与指针到指针变量的操作相同,这也可以很好地编译,但我认为有一个指针引用更干净。(至少在我的脑海中)有两种间接的想法很难处理。所以我认为我们应该在C++中去掉它,因为它是从C.@ RikB继承的坏习惯:当我写的时候, f1的类型是 Value。经过修正后,它与指针到指针变量的操作相同,这也可以很好地编译,但我认为有一个指针引用更干净。(至少在我的脑海中)有两种间接的想法很难处理。所以我认为我们应该在C++中去掉它,因为它是从C.继承下来的坏习惯。