что именно происходит, когда я делаю это задание - PullRequest
0 голосов
/ 20 октября 2018

Рассмотрим этот фрагмент

char a[]="";

Будет ли NULL -точка назначена указателю символа *a?

Если нет, то как проверить, что строка не имеетбыл назначен на a?

Ответы [ 4 ]

0 голосов
/ 20 октября 2018

==> Будет ли назначен NULL-указатель на символьный указатель *a?

Массивы не являются указателями.

Для лучшего понимания давайтесм. пример из стандарта C # 6.7.9p32 [выделение шахты]

ПРИМЕР 8 Объявление

     char s[] = "abc", t[3] = "abc";

определяет '' plain '' объекты массива char s и t, элементы которых инициализируются символьными строковыми литералами.Это объявление идентично

     char s[] = { 'a', 'b', 'c', '\0' },
           t[] = { 'a', 'b', 'c' };

Содержимое массивов может быть изменено.С другой стороны, объявление

     char *p = "abc";

определяет p с указателем type '' char '' и инициализирует его, чтобы указывать на объект с массивом типа '' char'' длиной 4, элементы которого инициализируются литералом символьной строки.Если предпринята попытка использовать p для изменения содержимого массива, поведение не определено.

Итак, этот оператор

char a[]="";

определяет char массив объект a, элементы которого инициализируются литералом символьной строки "".Обратите внимание, что "" является строковым литералом, содержащим один символ '\0'.
Вышеприведенный оператор эквивалентен

char a[] = {'\0'};

Если мы опускаем измерение, компилятор вычисляет его для нас на основе размераинициализатора (здесь это будет 1, потому что инициализатор имеет только один символ '\0').Таким образом, утверждение такое же, как

char a[1] = {'\0'};
0 голосов
/ 20 октября 2018

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

При этом при этой инициализации массив a будет инициализирован пустой строкой.

Пустая строка означает, что первый элемент будет завершающим нулевым символом, поэтому самый простой способ проверить, содержит ли массив пустую строку, - это сравнить первый элемент с нулевым, например,

 if (a[0] == '\0') {  /*do the action*/ }
0 голосов
/ 20 октября 2018

Будет ли назначен нулевой указатель на символьный указатель * a?

Здесь нет символа указатель здесь, но массив a из char.

a будет определен как массив char и инициализирован для хранения пустой строки, чтоявляется c-строкой с только что несущим 0-терминатор, который равен одному char.

как проверить, что строка не была назначена для?

Так что a будет иметь ровно один элемент.Этот элемент сравнивается равным '\0', который в свою очередь сравнивается равным 0.

Чтобы проверить это, выполните

#include <stdio.h> /* for puts() */
#include <string.h> /* for strlen() */

int main(void)
{
  char a[] = ""; /* The same as: char a[1] = ""; */

  /* Possibility 1: */
  if (0 == a[0]) /* alternatively use '\0' == a[0] */
  {
    puts("a is an empty string.");
  }

  /* Possibility 2: */
  if (0 == strlen(a))
  {
    puts("a has length zero.");
  }
}
0 голосов
/ 20 октября 2018

a будет содержать 1 элемент:

a[0] == '\0'

Примечание: a это не указатель.

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