C++ разница между массивами

199
19 сентября 2018, 00:30

Есть два массива:

  • char *str
  • char* str[]

По своему принципу, это просто одномерный массив, но при этом, я не могу добавить никаких значений во второй. Вопрос: какая между ними тогда разница? Зачем объявлять их именно в таком виде и какой от этого плюс?

Update

Answer 1
  • char* str[] (с пустыми квадратными скобками) — при использовании в качестве аргумента функции при её объявлении это то же самое, что и char **str.

    Как это дело трактовать — зависит исключительно от логики кода:

    • Это может быть указатель на массив указателей (тогда можно сделать что-то наподобие char *foo = str[16];). Причём элементы массива могут указывать как на начало нуль-терминированных строк, так и на отдельные символы, хранящиеся где-то в другом месте.

    • Это может быть просто указатель на char*-переменную, позволяющий модифицировать саму эту переменную отовсюду, куда мы передали этот указатель.

    • Это может быть двумерный массив типа char. Такой массив называется jagged и, в отличие от традиционного, позволяет хранить разное количество элементов в каждой строке (если первый индекс обозначает номер строки) или столбце (если первый индекс обозначает номер столбца)

  • char* str[N] (с некой константой в скобках) — это уже полноценный массив фиксированной длины, хранящий в себе N элементов типа char *.

    Однако в данном случае есть три важных момента:

    1. Это работает только при объявлении переменных. Если вы попытаетесь указать подобную конструкцию в качестве аргумента функции при её объявлении, содержимое квадратных скобок будет проигнорировано, и вы получите первый случай.

    2. Если вы совмещаете объявление массива с его заполнением (char* str = {...}), константу N можно опустить, тогда её значение будет вычислено автоматически.

    3. В C++ значение N должно быть именно константой, в противном случае вы получите ошибку компиляции. Массивы переменной длины разрешены только в Си не ранее C99.

Answer 2

Первый - указатель на char, второй - массив указателей на char. Ну, или, грубо говоря - первое - это C-строка, второе - массив указетелей на эти строки (но не сами данные).

Примерно так:

char * str;
str = new char[20];
strcpy(str, "Hello, world\n");
cout << str;
delete[] str;
const char* strs[] = { "Hello", "world" };
for(auto s: strs)
    cout << s << endl;
Answer 3

В первом случае у вас просто указатель на char, а вот второй случай интереснее и совершенно не равен первому.

char *str[] - это массив указателей на char. Тобишь его можно представлять как массив строк (что не совсем верно, но в общем случае можно и так). Тобишь если хотите чтобы указатель из массива указывал на нужную вам строку нужно что-то вроде:

char alfa[] = "alfa";
char beta[] = "beta";
char *str[2];
str[0] = alfa;
str[1] = beta;
Answer 4

Первое это указатель на char, а второе в зависимости от контекста может быть либо массивом указателей, либо указателем на указатель (если это тип аргумента функции).

READ ALSO
Определить сигнатуру функции

Определить сигнатуру функции

Как в C++ определить сигнатуру функции, переданной в шаблон другой функции? Делаю так:

253
Для чего был придуман интерфейс DXGI [закрыт]

Для чего был придуман интерфейс DXGI [закрыт]

В DiretX Api начиная с версии 10, присутствует интерфейс DXGI, именно 10, не 1

202
MinGW - SEH и SJLJ. Странное поведение

MinGW - SEH и SJLJ. Странное поведение

Имеется в наличии невероятно простой код:

172