2013-04-10 2 views

ответ

6

Я думаю, что путаница здесь связана с убеждением, что {"Hey","Hello"} - это массив. Это не. Это вовсе не объект. Это просто специальный синтаксис инициализатора, который можно использовать для инициализации массива. Вы не можете использовать его для инициализации char**, потому что char** является указателем, а не массивом. Он автоматически не создает объект массива, который можно преобразовать в указатель.

Возможно, вы думали об этом как о [...] в Python или { ... } объект в JavaScript. Это совсем не так. Эти выражения фактически создают объекты этого типа и могут использоваться в любом месте выражения, которое может принимать эти объекты.Синтаксис, который мы используем в C++, это только синтаксис инициализации.

Например, вы могли сделать это:

const char* array[] = {"Hey","Hello"}; 
const char** p = array; 

Вы, однако, не может сделать что-то глупое вроде этого:

std::cout << {"Hey", "Hello"}[1]; 

Здесь мы фактически создали объект массива, в котором указатели будут сохранены. Только тогда мы можем преобразовать этот массив в const char**.

+0

Very clear..thanxxx – tez

1

Почему я не могу указывать char** на массив строк C?

Как вы сказали, c1 - это массив. Поэтому вы должны объявить его как массив указателей на char.

С "Hey" и "Hello" являются струнными litterals, каждая c1[i] строки указует анонимную строку. Вот почему вы можете использовать указатели на char вместо массивов char.

Чтобы сделать массив указателей на char, вы не можете использовать char **.

0

«символ ** c1», говорит компилятору, что он является указателем на указатель для символьного типа, является скалярным типом (одно значение).

Инициализация с помощью списка значений работает только для совокупных типов.

+0

В 'char ** c1' нет двусмысленности. Это указатель на указатель на 'char'. (Конечно, оба указателя в приведенном выше могут быть для первого элемента массива.) –

+0

@James Kanze, да, моя ошибка. Удалил. – Arun

0
int main(int argc, char *argv[]) { 

    char** c1 = {"Hey","Hello"}; 
    printf("%s",c1[1]); 

} //error 

В коде выше, вы пытаетесь установить указатель на указатель на набор из двух строк. Где находится хранилище для двух указателей, которые содержат адрес «Эй» и «Привет» соответственно? Нигде.

Вы можете сделать:

char *a = "Hey"; 
char *b = "Hello"; 
char *c[] = { a, b };  // This MAY not compile due to a and b not being compile time constants. 
char **c1 = c; 

(я разбить его на более отдельных переменных, чем это на самом деле нужно, но я думаю, что это объясняет, что «неправильно» с кодом вполне ясно).

Другой пример может быть, если мы изменим char * в целом:

const int a = 1; 
const int b = 2; 

int c[] = { a, b }; 

int *c = { a, b }; // Doesn't work, there is nowhere to store a copy of a and b. 

Это то же самое, за исключением целых чисел.

Смежные вопросы