อะไรคือความแตกต่างระหว่าง "ถ่าน * A []" และ "ถ่าน ** A" ในภาษา C
ตอบ 1:
ถ่าน * a [] เป็นอาร์เรย์ของพอยน์เตอร์สำหรับตัวแปรประเภทถ่านในขณะที่ถ่าน ** a กำหนดตัวชี้ไปยังตัวแปรตัวชี้ของตัวแปรประเภทถ่าน
สำหรับเช่น
ถ่าน c = 'a'; // ค่า c = 2
ถ่าน * p = & c;
// p ตัวชี้ p ชี้ไปที่ตัวแปร c
ถ่าน ** pp = & p;
// pp ชี้ไปที่ตัวชี้ p ซึ่งชี้ไปที่ตัวแปร c
สำหรับข้อมูลเพิ่มเติมอ้างอิง URL: http: //www.thegeekstuff.com/2012 ...
ตอบ 2:
ถ่าน * A [] เป็นอาร์เรย์และถ่าน ** A เป็นตัวชี้ ใน C อาร์เรย์และตัวชี้มักจะใช้แทนกันได้ แต่มีความแตกต่าง:
1. ด้วย "char * A []" คุณไม่สามารถกำหนดค่าใด ๆ ให้กับ A แต่ A [x] เท่านั้น
ด้วย "char ** A" คุณสามารถกำหนดค่าให้กับ A และ A [x] เช่นกัน
2. ด้วย "char * A []" คุณสามารถเริ่มต้นอาร์เรย์ (เช่น char * A [] = {"foo", "bar"};) และใช้ sizeof (A) เพื่อรับขนาด (บน 64- บิต เครื่องตัวอย่างข้างต้นให้คุณ 16 เพราะมันเป็นอาร์เรย์ของสองถ่าน *);
ด้วย "char ** A" ขนาดของ (A) จะส่งคืนขนาดของตัวชี้เสมอ (บนเครื่อง 64- บิต 8)
ตอบ 3:
- ถ่าน * A [] หมายถึง "อาร์เรย์พอยน์เตอร์ไปยังตัวอักษร" ในขณะที่ถ่าน ** A หมายถึง "ตัวชี้ไปยังตัวชี้ไปยังตัวอักษร" โปรดทราบว่ารายการแรกจะบอกคุณอย่างชัดเจนว่าเรากำลังทำงานกับอาร์เรย์ในขณะที่รายการที่สองไม่รับประกัน อย่างไรก็ตามโดยการก่อสร้างทั้งสองจะเทียบเท่ากับ C เพราะอาร์เรย์จะถูกเก็บไว้เป็นตัวชี้ไปยังองค์ประกอบแรกในอาร์เรย์นั้นอาร์เรย์ของพอยน์เตอร์เป็นตัวอย่างพิเศษของตัวชี้ไปยังตัวชี้ ตัวชี้ไปยังตัวชี้ไม่จำเป็นต้องเป็นอาร์เรย์ของพอยน์เตอร์ ในการสาธิตสิ่งนี้โปรดทราบว่าสำหรับ arrray array pointer คุณสามารถกำหนด char ** A = (char **) (void *) arrp แต่คุณไม่สามารถ (เช่นมันโยนข้อผิดพลาดคอมไพเลอร์) char * A [] = ( char * []) (void * []) arrp; - ในความเป็นจริงคุณไม่สามารถสร้างอินสแตนซ์และอาร์เรย์โดยไม่ให้อาร์กิวเมนต์เป็นความยาวและคุณไม่สามารถส่งไปยังอาร์เรย์ได้เช่นเดียวกับพอยน์เตอร์
ตอบ 4:
แรกคือตัวชี้ [1] องค์ประกอบแรกของมัน (อาเรย์อาคา), ที่สองสามารถเป็นประเภทของตัวชี้ไปยังอาร์เรย์ของสตริงอักขระ [2]
ในคำอื่น ๆ อาร์เรย์จะสลายตัวไปยังพอยน์เตอร์และด้วยเหตุนี้จึงเป็นเพียงน้ำตาล syntactic (ตราบใดที่คุณมองข้ามการร้องขอการจัดสรรขนาดในกรณีของอาร์เรย์)
[1] ซึ่งแตกต่างจาก int *, char * เป็นประเภทพอยน์เตอร์อเนกประสงค์
[1] สตริงถูกส่งผ่านเป็นอาร์เรย์ที่สิ้นสุดด้วยค่า null เอง
สำหรับตัวอย่างเพิ่มเติมดู
คำตอบของเคนเกร็กต่อฉันควรกำหนดพอยน์เตอร์พอยน์เตอร์ในโปรแกรมหลัก C เป็นอาร์กิวเมนต์เมื่อใด
คำตอบของ Sergey Zubkov ไปเป็นอาร์เรย์ของอาร์เรย์ที่เป็นไปได้ใน C?
คำตอบของ John L. Miller ต่อ Array of Array ที่เป็นไปได้ใน C หรือไม่?