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继承的坏习惯:当我写的时候,