Bir simvol massivi və C simli arasındakı fərq nədir?


cavab 1:

Bir sıra simvollar, 8 bit bayt kimi təhlil olunan yaddaşın bitişik bir yeridir. Yaradılma ölçüsü sabitdir və hər baytda bir simvolun saxlanılmasına zəmanət verilir.

Bu vəziyyətdə bir simvol 00000000 (0x00 hex) -dən 11111111 (0xFF hex) -ə qədər 8 bitlik ikili rəqəmdir.

char array [100]; / * 100 simvol massivi [0] massivi [99] * /

AC simli saxlama üçün char array istifadə edir. A C sətri serialın mənfi 1 simvolunun uzunluğuna 0 ola bilər.

Düzgün qurulmaq üçün, sıra yalnız istifadə olunan simvolda etibarlı simvolları təmsil edən baytlardan ibarət ola bilər. Bu çox vaxt ASCII və ya UTF-8-dir. Sətir çap edildikdə və ya şərh edilərkən bütün digər baytlar etibarlı olmaya bilər.

Sətirdə bir sıra etiket var (dəyişən), bu massivin ünvanını ehtiva edən bir xarakter göstərici növüdür (char *).

Sətirdə son simvoldan sonra sətri bitirən NULCHAR ('\ 0', 0x00 hex) var.

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

Bir "dərhal satır" mənbə kodunda ikiqat tirnoq işarələrində yazılır və doldurulmuş simvol ilə bir simvol silsiləsinin yaradılmasına və sətirlər üçün xüsusi oxunuş yerində saxlanılmasına səbəb olur və onlara göstərici qaytarılır. Bu "tərtibçi sintaksis şəkəridir" və bu cür iplərin istifadəsini asanlaşdırır. Düzgün qurulmuş bir simli etmək üçün NULCHAR avtomatik olaraq seriala əlavə olunur.

char * s = "təcili bir simli"; printf ("% s \ n), s);

C kitabxanasının bütün standart funksiyaları sətirləri simvol şəklində keçir və '\ 0' olduğunu güman edir.

Kifayət qədər universal şəkildə istifadə olunan "hack", bir sıra əldə edildikdə, serialın ilk elementinə göstərici kimi xidmət edir. və əksinə.

char * x = "abcdefgh"; printf ("x 4-cü simvol:% c \ n", x [3]); x 4-cü simvol: d / * bir simvol massivinə bir sətir daxil edin * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); char * a = str; char * b = str + 7; printf ("% s \ n", a); abcdefghijklmnop printf ("% s \ n", b); hicklmnop

Bu rahatlığa baxmayaraq, char array və C simli birbaşa uyğun gəlmir.

char s [10]; s = "abcdefghi"; / * səhv * / // səhv: 'char *' 'abcdefghi' növünün 'char [10]' növünə təyin olunduqda uyğun olmayan növlər dərhal satır və bunun üçün yaradılan massivdə 'a' nöqtəsinə həll olunur. Təyinat s işləmir, çünki char arrays təyin edilə bilməz.

Seriallar həqiqətən C-də birinci dərəcəli bir növ deyil. Onları birbaşa kopyalamaq olmur, serial səviyyəsində əməliyyatlar yoxdur və s. C-də seriallarla edilən hər şey vahid olaraq deyil, fərdi tərkib üçün edilir.

char s [10]; char * x = "abcdefghi"; / * '\ 0' sonunda * / strncpy (s, x, 10); / * hər bir simvolu seriala köçürür *

cavab 2:

Bir simvol silsiləsi C proqramlaşdırma dilində bir məlumat quruluşudur: simvolları saxlaya biləcəyiniz yaddaşdakı bir sıra bayt. Bu hüceyrələrin hər birində hər hansı bir simvol (yəni 8 bit bayt, 0-dan 255-dək) ​​saxlaya bilərsiniz.

Bir C tərzi simli (sualınızda "c-string" i şərh etdiyim kimi) C dilinin null bayt (dəyər) olmadan bir sıra simvol olaraq təyin etdiyi simvolların "sətrini" təmsil etməyin bir yoludur. 0). Bu simvolların özləri ilə ifadə olunur, ardınca sıfır bayt var, beləliklə, simin uzunluğunu ayrıca saxlamaq lazım deyil. Bunu Paskal tərzi ilə müqayisə et, 16 bit imzalanmamış tam say ilə izləyin və bu sayda məlumat baytının ardınca (Paskal simli 65535 və ya daha az).

Xarakter silsiləsi məlumat quruluşudur, C tərzi simli məlumat təmsilidir. Fərqli heyvanlardır.

Bir simvol massivində C üslublu bir sətir və ya başqa bir şey ola bilər (məsələn, boş işarədən sonra faydalı məlumatlar var və ya ümumiyyətlə heç bir boşluq yoxdur). və buna baxmayaraq, yenə də onu C tərzi simli kimi şərh edə bilərsiniz (ən azı bir boşluq xarakterli olduğu halda). C tərzi simli bir simvol silsiləsində və ya serialdan başqa bir yerdə saxlanıla bilər (məsələn, yaddaşın yalnız oxunan hissəsi və buna görə digər dəyərləri "saxlaya bilməz").