如何将值放入const char **?

时间:2009-01-23 09:31:53

标签: c char const

如果我声明一个变量const char ** stringTable,如果它是一个const,我怎么能把值放到它? (它必须是const,因为我应该使用的函数将const char **作为参数。)

编辑: 不,你不能隐含地从char **转换为const char **。编译抱怨: 不能将参数3从'char **'转换为'const char **'

8 个答案:

答案 0 :(得分:5)

哇,我很惊讶没有人得到这个!也许我可以获得死灵法师徽章。隐式const转换仅扫描一层深度。因此,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);