อะไรคือความแตกต่างระหว่าง "ถ่าน * 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:
  1. ถ่าน * 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 หรือไม่?