如果我声明一个变量const char ** stringTable,如果它是一个const,我怎么能把值放到它? (它必须是const,因为我应该使用的函数将const char **作为参数。)
编辑: 不,你不能隐含地从char **转换为const char **。编译抱怨: 不能将参数3从'char **'转换为'const char **'
答案 0 :(得分:5)
char*
可以成为const char*
,但它不会在char**
类型内深入挖掘,以找到需要更改的内容,使其成为const char**
。< / p>
#include <iostream>
using namespace std;
void print3( const char **three ) {
for ( int x = 0; x < 3; ++ x ) {
cerr << three[x];
}
}
int main() {
// "three" holds pointers to chars that can't be changed
const char **three = (const char**) malloc( sizeof( char** ) * 3 );
char a[5], b[5], c[5]; // strings on the stack can be changed
strcpy( a, "abc" ); // copy const string into non-const string
strcpy( b, "def" );
strcpy( c, "efg" );
three[0] = a; // ok: we won't change a through three
three[1] = b; // and the (char*) to (const char*) conversion
three[2] = c; // is just one level deep
print3( three ); // print3 gets the type it wants
cerr << endl;
return 0;
}
答案 1 :(得分:4)
这个const声明是函数的保证,你不必填写它。这意味着该函数将保持您的数组不受影响(它只会读取)。因此,您可以将非对象变量传递给期望const的函数。
答案 2 :(得分:4)
除了其他提及你可以将char**
传递给需要const char **
的函数,
const char**
是指向const char*
的非const指针,您可以声明它并自由地将const char*
类型的值放入其中。
另一方面,如果您将其声明为const char * const *
或const char * const * const
,则无法执行此操作。
yourfunc(const char **p);
...
const char *array_str[10];
array_str[0] = "foo"; /* OK, literal is a const char[] */
yourfunc(array_str);
以下是cdecl
所说的内容:
cdecl> explain const char **table
declare table as pointer to pointer to const char
cdecl> explain const char * const *table
declare table as pointer to const pointer to const char
cdecl> explain const char * const * const table
declare table as const pointer to const pointer to const char
答案 3 :(得分:3)
您可以将char **
传递给声明为const char **
的函数 - 可能值得一看MSDN上的documentation for const
答案 4 :(得分:1)
char **
可以转换为const char **
,因此如果你想调用一个以const char **
为参数的函数,只需提供你的{{} 1}}它将被隐式转换。
如果你想编写一个以char **
为参数然后修改它所引用的const char **
数据的函数,那你就违反了与编译器的契约,即使你可以通过演员阵容让它工作!
答案 5 :(得分:1)
使用我的编译器(cygwin中的gcc版本3.4.4),我发现我可以将char *
传递给const char *
,但不能char **
传递给const char **
,这与大多数答案都在说。
这是一种可以构建有效的东西的方法;也许它会帮助你。
void printstring( const char **s ) {
printf( "%s\n", *s );
}
int main( int argc, char** argv ) {
char *x = "foo"; // here you have a regular mutable string
const char *x2 = x; // you can convert that to a constant string
const char **y = &x2; // you can assign the address of the const char *
printstring(y);
}
答案 6 :(得分:0)
你可以使用强制转换操作符取消const char *:(char *)
void do_something(const char* s)
{
char* p=(char*)s;
p[0]='A';
}
对数组char **使用相同的想法
答案 7 :(得分:0)
const char **
表示底层字符是常量。所以,虽然你不能做这样的事情:
const char **foo = ...;
**foo = 'a'; // not legal
但没有什么能阻止你操纵指针本身:
// all the following is legal
const char **foo = 0;
foo = (const char **)calloc(10, sizeof(const char *));
foo[0] = strdup("foo");
foo[1] = strdup("baz");
那就是说,如果你确实想修改实际的字符数据,可以使用非常量指针并将其强制转换:
char **foo = ...;
func((const char **)foo);