C указатели и объявление массива - PullRequest
2 голосов
/ 08 ноября 2011

Я в настоящее время изучаю C через " Learning C трудный путь "

Я немного запутался в некоторых примерах кода, почему некоторые массивы должны быть инициализированы указателем.

 int ages[] = {23, 43, 12, 89, 2}; 
  char *names[] = {
      "Alan", "Frank",
      "Mary", "John", "Lisa"
  }; 

В вышеприведенном примере, почему массив names [] требует указателя при объявлении? Как узнать, когда использовать указатель при создании массива?

Ответы [ 5 ]

5 голосов
/ 08 ноября 2011

Строковый литерал, такой как "Alan", имеет тип char[5], и для указания начала строки вы используете char *."Alan" сам состоит из:

{ 'A', 'L', 'A', 'N', '\0' }

Как вы можете видеть, он состоит из нескольких char с.Это char * указывает на начало строки, буква 'A'.

Поскольку вы хотите массив из этих строк Затем вы добавляете [] к вашему объявлению, так что оно становится: char *names[].

3 голосов
/ 08 ноября 2011

Предпочитайте константные указатели при использовании строковых литералов.

 const char *names[] = {
      "Alan", "Frank",
      "Mary", "John", "Lisa"
  }; 

В объявлении name - это массив const char указателей, что означает, что он содержит 5 char* для cstrings.когда вы хотите использовать указатель, вы используете простой указатель.

Пример:

const char *c = "Hello world";

Итак, когда вы используете их в массиве, вы создаете 5const char* указатели, которые указывают на строковые литералы.

2 голосов
/ 09 ноября 2011

Использование «массива указателей» не обязательно.

Следующее также будет работать. Это массив из 20 байтов символов. Компилятору нужно знать только размер элемента в массиве, а не длину массива. В итоге получается массив из 5 элементов по 20 байтов каждый с именем в каждом.

#include <stdio.h>

char names[][20] = {
  "Alan", "Frank",
  "Mary", "John", "Lisa"
};

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

  for (idx = 0; idx < 5; idx++) {
    printf("'%s'\n", names[idx]);
  }
}

В вашем примере размер элемента в массиве - "указатель на символ". Строковая константа может использоваться для инициализации либо «указателя на символ», либо «массива символа».

2 голосов
/ 08 ноября 2011

В случае char *names[] вы объявляете массив строковых указателей.

строка в C, например "Alan" - это серия символов в памяти, заканчивающаяся значением \ 0, обозначающим конец строки

так что с этим заявлением вы делаете это

names[0] -> "Alan\0"
names[1] -> "Frank\0"
...

тогда вы можете использовать имена [n] в качестве указателя на строку

printf( "%s:%d", names[0], strlen(names[0]) );

, который дает вывод "Alan:4"

2 голосов
/ 08 ноября 2011

Поскольку содержимое массива является char*. Другой пример имеет int. «Alan» - это строка, а в C вы объявляете строки как char pointers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...