2014-01-12 3 views
0
char *string = "a"; 
string = "abc"; 

Вышеприведенный фрагмент кода действителен.Использование различных строк в C?

char string2 [2] = "a"; 
string2 = "abc"; 

Вторая часть кода недействительна. Зачем? Не указано string2 a char*string? Как у одного и того же типа есть разные свойства?

+0

Массив * не * совпадает с указателем. Никогда не было. Это было рассмотрено в Stack Overflow больше времени, чем я могу считать (целочисленное переполнение). – dmckee

+0

[В C FAQ есть хорошая страница ответа.] (Http://c-faq.com/aryptr/) – nes1983

ответ

2

string является указателем на char. string2 - это массив из char элементов. Эти два являются разными типами.

В вашем втором примере вы пытаетесь назначить указатель на массив (строковые литералы оцениваются указателями). Это не имеет смысла и не представляется возможным. Это на самом деле не отличается от:

int numbers[2]; 
int num; 
numbers = # // How's that supposed to work? 

Люди получают немного смущены этим, потому что вы можете использовать оператор индекса [] на указатели, а имя массива вычисляется в указатель на его первый элемент. Это не означает, что указатели представляют собой массивы или наоборот. Это просто синтаксический сахар, чтобы облегчить доступ к указанным или содержащимся данным.

0

Вторая часть кода недействительна. Зачем?

Поскольку имена массивов являются немодифицируемыми значениями l.

Не string2char* как string?

Номер string2 представляет собой массив 2char с string в то время как указатель на char.

Как этот тип может иметь разные свойства?

ли помните, указатели не являются массивами. string и string2 имеют различный тип.

+0

Оператор '=' не копирует данные из одной строки в другую. Проблема здесь не имеет ничего общего с количеством вовлеченных персонажей. Это все равно будет ошибкой, если он прочитает 'char string2 [2] =" abc "; string2 = "a"; '. – dmckee

+0

@dmckee; Да. Ты прав. Отредактировано сейчас. – haccks

0

В вашем втором коде вы пытаетесь присвоить новую строку массиву.

В массивах C не могут быть непосредственно назначены. Вы можете использовать strcpy

char string2 [2] = "a"; 
strcpy(string2, "ab"); 
Смежные вопросы