ความแตกต่างระหว่างอาเรย์ตัวละครและ c-string คืออะไร?


ตอบ 1:

อาร์เรย์ของถ่านคือการขยายหน่วยความจำต่อเนื่องที่แยกออกมาเป็น 8 บิตไบต์มันคงขนาดในการสร้างและรับประกันว่าจะเก็บถ่านในทุกไบต์

ถ่านในกรณีนี้คือเลขฐานสอง 8 บิตจาก00000000 (0x00 ฐานสิบหก) ถึง 11111111 (ฐานสิบหก 0xFF)

แถวลำดับ [100]; / * 100 chars array [0] ถึง array [99] * /

สตริง C ใช้อาร์เรย์ถ่านสำหรับการจัดเก็บ C-string สามารถมีตั้งแต่ 0 ถึงความยาวของอาเรย์ลบด้วยความยาว 1 อักขระ

เพื่อให้มีรูปแบบที่ดีอาร์เรย์อาจมีชุดย่อยของไบต์ที่แทนสัญลักษณ์ที่ถูกต้องในชุดอักขระที่จะใช้ บ่อยครั้งที่นี่คือ ASCII หรือ UTF-8. ไบต์อื่น ๆ อาจไม่ถูกต้องเมื่อพิมพ์หรือตีความสตริง

สตริงจะมีเลเบล (ตัวแปร) ที่เป็นตัวชี้อักขระ (อักขระ *) ที่ได้รับที่อยู่ของอาร์เรย์

สตริงจะมี NULCHAR, ('\ 0', 0x00 ฐานสิบหก) เพื่อยกเลิกสตริงหลังจากอักขระตัวสุดท้ายของสตริง

ถ่าน s [10]; ถ่าน * t = & s; strncpy (t, "012345678 \ 0", 10)

'สตริงทันที' ถูกเขียนด้วยเครื่องหมายอัญประกาศคู่ในซอร์สโค้ดและทำให้อาร์เรย์ถ่านที่มีตัวอักษรเติมเต็มเพื่อสร้างและวางในตำแหน่งสตริงหน่วยความจำแบบอ่านอย่างเดียวเท่านั้นและจะส่งคืนพอยน์เตอร์ นี่คือ "ซินแท็กซ์น้ำตาล" โดยคอมไพเลอร์และทำให้ง่ายต่อการใช้สตริงดังกล่าว NULCHAR ถูกผนวกเข้ากับอาร์เรย์โดยอัตโนมัติเพื่อทำให้เป็นสตริงที่มีรูปแบบที่ดี

ถ่าน * s = "สตริงทันที"; printf ("% s \ n), s);

ฟังก์ชันสตริงไลบรารี C ทั้งหมดมาตรฐานส่งผ่านสตริงเป็นอักขระ char * s และพึ่งพา '\ 0' ที่มีอยู่

“ แฮ็ค” ที่ใช้กันอย่างแพร่หลายในระดับสากลคือป้ายกำกับของอาเรย์เมื่อมีการเข้าถึงคู่จะเป็นตัวชี้ไปยังองค์ประกอบแรกของอาเรย์ และในทางกลับกัน.

ถ่าน * x = "abcdefgh"; printf ("x อักขระถ่านที่ 4:% c \ n", x [3]); x ถ่านที่ 4: d / * ใส่สตริงเข้าไปในอาร์เรย์ถ่าน * / ถ่าน str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); ถ่าน * a = str; ถ่าน * b = str + 7; printf ("% s \ n", a); abcdefghijklmnop printf ("% s \ n", b); hijklmnop

แม้จะมีความยืดหยุ่นเช่นนี้อาร์เรย์ถ่านและสตริง C ไม่สามารถใช้งานร่วมกันได้โดยตรง

ถ่าน s [10]; s = "abcdefghi"; / * error * / // error: ประเภทที่เข้ากันไม่ได้เมื่อกำหนดให้พิมพ์ 'char [10]' จากประเภท 'char *' "abcdefghi" เป็นสตริงทันทีและแก้ไขให้ตัวชี้ 'a' ในอาร์เรย์ที่สร้างขึ้นสำหรับมัน การกำหนดให้มันไม่ทำงานเนื่องจากไม่สามารถมอบหมายอาร์เรย์ถ่าน

อาร์เรย์ไม่ได้เป็นประเภทเฟิร์สคลาสใน C พวกเขาไม่สามารถคัดลอกโดยตรงพวกเขาไม่มีการดำเนินการระดับอาเรย์และอื่น ๆ ทุกอย่างที่ทำกับอาร์เรย์ใน C นั้นทำกับเนื้อหาแต่ละรายการไม่ใช่ในหน่วย

ถ่าน s [10]; ถ่าน * x = "abcdefghi"; / * '\ 0' อยู่ท้าย * / strncpy (s, x, 10); / * คัดลอกอักขระแต่ละตัวไปยังอาร์เรย์ * /

ตอบ 2:

อาร์เรย์อักขระเป็นโครงสร้างข้อมูลในภาษาการเขียนโปรแกรม C: จำนวนไบต์ในหน่วยความจำที่คุณสามารถเก็บอักขระได้ คุณสามารถเก็บอักขระใด ๆ (เช่นไบต์ 8 บิตค่า 0 ถึง 255) ในแต่ละเซลล์เหล่านี้

สตริง C-style (ตามที่ฉันตีความ“ c-string” ในคำถามของคุณที่จะหมายถึง) เป็นวิธีการแสดง“ สตริง” ของตัวละครที่กำหนดโดยภาษา C เป็นจำนวนตัวอักษรที่ไม่มีไบต์ว่าง (ค่า 0) นี่เป็นตัวแทนของตัวละครเหล่านั้นเองตามด้วย null null ดังนั้นจึงไม่จำเป็นต้องแยกความยาวของสตริง เปรียบเทียบสิ่งนี้กับสตริงสไตล์ Pascal ซึ่งมีจำนวนเต็ม 16 บิตที่ไม่ได้ลงชื่อตามด้วยข้อมูลจำนวนไบต์ (เพื่อให้ความยาวของสตริง Pascal มีค่าสูงสุด 65535)

ดังนั้นอาร์เรย์อักขระเป็นโครงสร้างข้อมูลสตริง C-style จึงเป็นตัวแทนข้อมูล พวกมันเป็นสัตว์ร้าย

อาร์เรย์อักขระสามารถเก็บสตริง C-style หรืออาจเก็บอย่างอื่น (เช่นมีข้อมูลที่เป็นประโยชน์หลังจากตัวอักษร Null หรือไม่มีอักขระ Null ใด ๆ ); และแม้ว่าคุณจะสามารถตีความมันเป็นสตริง C-style ได้ (ตราบใดที่มันมีอักขระ null อย่างน้อยหนึ่งตัว) สตริง C-style อาจถูกเก็บไว้ในอาเรย์ตัวละครหรืออาจถูกเก็บไว้ในที่อื่นที่ไม่ใช่อาเรย์