Каква е разликата между символен масив и c-низ?


Отговор 1:

Масивът от char е непрекъснат период от памет, който се анализира като 8 битови байта. Той е фиксиран по размер при създаване и гарантирано съхраняване на char във всеки байт.

Знака в този случай е всяка 8-битова двоична цифра от00000000 (0x00 шестнадесетична) до 11111111 (0xFF шестнадесетична).

масив char [100]; / * 100 символа масив [0] до масив [99] * /

C-низът използва масив char за съхранение. C-низът може да бъде от 0 до дължината на масива минус 1 знака.

За да бъде добре оформен, масивът може да съдържа само подмножество от байтове, представляващи валидни символи в използвания набор от символи. Често това е ASCII или UTF-8.Всички други байтове може да не са валидни при печат или интерпретация на низа.

Низът ще има етикет (променлива), който е тип указател (char *), който съдържа адреса на масива.

Низът ще има NULCHAR, ('\ 0', 0x00 шестнадесетична), завършващ низа, след последния символ на низа.

char s [10]; char * t = & s; strncpy (t, "012345678 \ 0", 10)

„Непосредствен низ“ се изписва с двойни кавички в изходния код и причинява създаването на масивна таблица с попълнените символи и поставяне в специално място за памет само за четене и показалец към него се връща. Това е „синтаксисна захар“ от компилатора и улеснява използването на такива низове. NULCHAR автоматично се добавя към масива, за да го направи добре оформен низ.

char * s = "незабавен низ"; printf ("% s \ n), s);

Всички стандартни низови функции на C библиотеката предават низовете като char * s и разчитат на присъствието на '\ 0'.

"Хак", който се използва сравнително универсално, е, че етикетът на масива, когато се осъществява достъп, се удвоява като показалец към първия елемент от масива. и обратно.

char * x = "abcdefgh"; printf ("x 4-та знака:% c \ n", x [3]); x четвърта char: d / * поставете низ в масив char * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); char * a = str; char * b = str + 7; printf ("% s \ n", a); abcdefghijklmnop printf ("% s \ n", b); hijklmnop

Въпреки тази гъвкавост, масивът от символи и C-низът не са пряко съвместими.

char s [10]; s = "abcdefghi"; / * грешка * / // грешка: несъвместими типове при приписване на тип „char [10]“ от тип „char *“ „abcdefghi“ е незабавен низ и се решава на указател към „a“ в масива, създаден за него. Присвояването на s към него не работи, тъй като масивите char не се присвояват.

Масивите всъщност не са тип първи клас в C. Те не могат да бъдат копирани директно, нямат операции на ниво масив и т.н. Всичко, което се прави с масиви в C, се прави на отделното съдържание, а не като единица.

char s [10]; char * x = "abcdefghi"; / * '\ 0' е в края * / strncpy (s, x, 10); / * копира всяка таблица в масив * /

Отговор 2:

Масивът от символи е структура на данни в езика за програмиране на C: брой байтове в паметта, в които можете да съхранявате знаци. Можете да съхранявате всеки символ (т.е. байтове от 8 бита, стойност от 0 до 255) във всяка от тези клетки.

Низът в стил С (както това, което интерпретирам „c-низ“ във вашия въпрос, означава) е начин да се представи „низ“ от знаци, дефиниран от езика C, за да бъде брой символи без нулевия байт (стойност 0). Това се представя от самите символи, последвани от нулев байт, като по този начин няма нужда отделно да се съхранява дължината на низа. Сравнете това с низ в стил Pascal, където той е представен от 16-битово неподписано цяло число, последвано от този брой байтове информация (така че дължината на низ на Pascal да е най-много 65535).

Значи масивът от символи е структура от данни, низът в стил C е представяне на данни. Те са различни зверове.

Характерният масив може да съдържа низ в стил С или може да съдържа нещо друго (например, той съдържа полезна информация след нулевия символ или не съдържа нулев символ); и дори така може да бъдете в състояние да го интерпретирате като низ в стил C (стига да съдържа поне един нулев знак). Низът в стил C може да бъде съхранен в символен масив или може да бъде съхранен в някъде, а не в масив (например част, която е само за четене на паметта и по този начин не може да „съхранява“ други стойности).