คำถามติดแท็ก pointers

ชนิดข้อมูลที่ "ชี้ไปที่" ค่าอื่นเก็บไว้ในหน่วยความจำ ตัวแปรตัวชี้ประกอบด้วยที่อยู่หน่วยความจำของเอนทิตีอื่น ๆ (ตัวแปรหรือฟังก์ชันหรือเอนทิตีอื่น ๆ ) แท็กนี้ควรใช้สำหรับคำถามที่เกี่ยวข้องกับการใช้พอยน์เตอร์ไม่ใช่การอ้างอิง ภาษาโปรแกรมที่ใช้กันทั่วไปโดยใช้พอยน์เตอร์คือภาษา C, C ++, Go และภาษาแอสเซมบลี ใช้แท็กภาษาเฉพาะ แท็กที่เป็นประโยชน์อื่น ๆ คือวิธีการฟังก์ชั่น struct ฯลฯ อธิบายการใช้ตัวชี้

8
เป็นไปได้หรือไม่ที่จะเริ่มต้นตัวชี้ C เป็น NULL
ฉันเคยเขียนสิ่งต่างๆเช่น char *x=NULL; บนสมมติฐานที่ว่า char *x=2; จะสร้างcharตัวชี้ไปยังที่อยู่ 2 แต่ในบทช่วยสอนการเขียนโปรแกรม GNU Cบอกว่าจะint *my_int_ptr = 2;เก็บค่าจำนวนเต็ม2ไว้ที่ที่อยู่แบบสุ่มใด ๆ ก็ตามmy_int_ptrเมื่อมีการจัดสรร สิ่งนี้ดูเหมือนจะบอกเป็นนัยว่าของฉันเองchar *x=NULLกำลังกำหนดค่าของการNULLร่ายให้กับ a charคือที่อยู่แบบสุ่มบางส่วนในหน่วยความจำ ในขณะที่ #include <stdlib.h> #include <stdio.h> int main() { char *x=NULL; if (x==NULL) printf("is NULL\n"); return EXIT_SUCCESS; } ในความเป็นจริงพิมพ์ เป็นโมฆะ เมื่อฉันรวบรวมและเรียกใช้ฉันกังวลว่าฉันกำลังอาศัยพฤติกรรมที่ไม่ได้กำหนดหรืออย่างน้อยพฤติกรรมที่ไม่ระบุและฉันควรเขียน char *x; x=NULL; แทน.

4
ความหมายของ int (*) (int *) = 5 (หรือค่าจำนวนเต็ม)
ฉันคิดไม่ออก: int main() { int (*) (int *) = 5; return 0; } การมอบหมายข้างต้นรวบรวมด้วย g ++ c ++ 11 ฉันรู้ว่านั่นint (*) (int *)เป็นตัวชี้ไปยังฟังก์ชันที่ยอมรับ(int *)เป็นอาร์กิวเมนต์และส่งกลับค่า int แต่ฉันไม่เข้าใจว่าคุณจะเทียบเคียงเป็น 5 ได้อย่างไรในตอนแรกฉันคิดว่ามันเป็นฟังก์ชันที่คืนค่า 5 อย่างต่อเนื่อง (จากการเรียนรู้ล่าสุดของฉันใน F # น่าจะเป็นฮ่าฮ่า) จากนั้นฉันก็คิดสั้น ๆ ว่าตัวชี้ฟังก์ชันชี้ไปที่ตำแหน่งหน่วยความจำ 5 แต่ไม่ได้ผลชัดเจนและไม่มีค่าฐานสิบหก คิดว่าอาจเป็นเพราะฟังก์ชันส่งคืน int และการกำหนด int ก็โอเค (อย่างใด) ฉันก็ลองสิ่งนี้ด้วย: int * (*) (int …

6
วิธีเปรียบเทียบพอยน์เตอร์
สมมติว่าฉันมีพอยน์เตอร์ 2 ตัว: int *a = something; int *b = something; ถ้าฉันต้องการเปรียบเทียบพวกเขาและดูว่าพวกเขาชี้ไปที่ที่เดียวกัน (a == b) ได้ผลหรือไม่?
88 c++  pointers 

5
ข้อผิดพลาด: การเริ่มต้นที่ไม่ถูกต้องของการอ้างอิงที่ไม่ใช่ const ของประเภท 'int &' จาก rvalue ของประเภท 'int'
แบบฟอร์มไม่ถูกต้อง: int &z = 12; แบบฟอร์มที่ถูกต้อง: int y; int &r = y; คำถาม : ทำไมรหัสแรกผิด? "ความหมาย " ของข้อผิดพลาดในชื่อเรื่องคืออะไร?

5
การเริ่มต้นค่า“ int * ptr = int ()” ไม่ผิดกฎหมายอย่างไร
รหัสต่อไปนี้ (นำมาจากที่นี่ ): int* ptr = int(); คอมไพล์ใน Visual C ++ และค่าเริ่มต้นตัวชี้ เป็นไปได้อย่างไร? ฉันหมายถึงint()ให้วัตถุประเภทหนึ่งintและฉันไม่สามารถกำหนดให้intกับตัวชี้ได้ โค้ดข้างบนไม่ผิดกฎหมายได้อย่างไร?

10
อะไรคือความแตกต่างระหว่างการอ้างอิง C # และตัวชี้?
ฉันไม่ค่อยเข้าใจความแตกต่างระหว่างการอ้างอิง C # และตัวชี้ ทั้งคู่ชี้ไปที่สถานที่ในความทรงจำไม่ใช่เหรอ? ข้อแตกต่างเพียงอย่างเดียวที่ฉันเข้าใจได้คือพอยน์เตอร์ไม่ฉลาดเท่าชี้ไปที่อะไรบนฮีปไม่ได้ได้รับการยกเว้นจากการเก็บขยะและสามารถอ้างอิงได้เฉพาะโครงสร้างหรือประเภทฐานเท่านั้น หนึ่งในเหตุผลที่ฉันถามคือมีการรับรู้ว่าผู้คนต้องเข้าใจพอยน์เตอร์เป็นอย่างดี (จาก C ฉันเดา) เพื่อเป็นโปรแกรมเมอร์ที่ดี ผู้คนจำนวนมากที่เรียนรู้ภาษาระดับสูงพลาดสิ่งนี้จึงมีจุดอ่อนนี้ ฉันไม่เข้าใจสิ่งที่ซับซ้อนเกี่ยวกับตัวชี้? โดยพื้นฐานแล้วเป็นเพียงการอ้างอิงถึงสถานที่ในความทรงจำไม่ใช่หรือ มันสามารถคืนตำแหน่งและโต้ตอบกับวัตถุในตำแหน่งนั้นได้โดยตรง? ฉันพลาดจุดใหญ่ไปหรือเปล่า?
86 c#  pointers  reference 

7
ฉันสามารถใช้ NULL แทนค่า 0 ได้หรือไม่?
ฉันได้รับอนุญาตให้ใช้NULLตัวชี้แทนค่า0ใช่หรือไม่ หรือมีอะไรผิดปกติเกี่ยวกับการทำเช่นนั้น? ตัวอย่างเช่น: int i = NULL; เพื่อทดแทนสำหรับ: int i = 0; ในการทดลองฉันรวบรวมรหัสต่อไปนี้: #include <stdio.h> int main(void) { int i = NULL; printf("%d",i); return 0; } เอาท์พุท: 0 อันที่จริงมันทำให้ฉันเตือนนี้ซึ่งถูกต้องสมบูรณ์ด้วยตัวเอง: warning: initialization makes integer from pointer without a cast [-Wint-conversion] แต่ผลลัพธ์ยังคงเท่าเดิม ฉันกำลังเข้าสู่ "พฤติกรรมที่ไม่ได้กำหนด" กับสิ่งนี้หรือไม่? อนุญาตให้ใช้NULLในลักษณะนี้ได้ไหม มีอะไรผิดปกติNULLไหมในการใช้เป็นค่าตัวเลขในนิพจน์เชิงคณิตศาสตร์? และผลลัพธ์และพฤติกรรมใน C ++ สำหรับกรณีนี้คืออะไร ฉันได้อ่านคำตอบของอะไรคือความแตกต่างระหว่างโมฆะ …

4
อะไร ((เป็นโมฆะ (*) ()) buf) (); หมายความว่าอย่างไร
ฉันกำลังแก้ไขปัญหาการแสวงหาผลประโยชน์แบบไบนารีบน picoCTF และพบกับโค้ดชิ้นนี้: ((void (*)())buf)(); ที่bufเป็นอาร์เรย์ตัวอักษร ฉันแก้ไขความท้าทาย แต่ดูเหมือนจะไม่เข้าใจว่ามันทำอะไรอยู่ ฉันดูที่กระทู้นี้แต่ฉันไม่สามารถทำให้มันออกมาได้ อะไร((void (*)())buf)();หมายถึง?

6
เหตุใดจึงมีการอ้างสิทธิ์การยกเลิกการลงทะเบียนประเภทตัวชี้คำเตือนเฉพาะคอมไพเลอร์?
ฉันได้อ่านโพสต์ต่างๆ ในStack Overflow RE: ข้อผิดพลาดพอยน์เตอร์ที่พิมพ์ผิดประเภท ความเข้าใจของฉันคือข้อผิดพลาดโดยพื้นฐานแล้วคำเตือนของคอมไพเลอร์เกี่ยวกับอันตรายของการเข้าถึงวัตถุผ่านตัวชี้ประเภทอื่น (แม้ว่าจะมีข้อยกเว้นเกิดขึ้น) ซึ่งเป็นคำเตือนที่เข้าใจได้และสมเหตุสมผล char* คำถามของฉันเฉพาะรหัสด้านล่าง: เหตุใดการกำหนดที่อยู่ของตัวชี้ให้มีvoid**คุณสมบัติสำหรับคำเตือนนี้ (เลื่อนเป็นข้อผิดพลาดผ่าน-Werror) ยิ่งไปกว่านั้นโค้ดนี้ได้รับการรวบรวมสำหรับสถาปัตยกรรมเป้าหมายหลาย ๆ อันซึ่งหนึ่งในนั้นเท่านั้นที่สร้างคำเตือน / ข้อผิดพลาด - นี่อาจหมายถึงว่ามันเป็นข้อบกพร่องเฉพาะรุ่นคอมไพเลอร์อย่างถูกกฎหมายหรือไม่ // main.c #include <stdlib.h> typedef struct Foo { int i; } Foo; void freeFunc( void** obj ) { if ( obj && * obj ) { free( *obj ); *obj = …
38 c  pointers  casting 

3
การเพิ่มตัวชี้ไปยังอาร์เรย์ไดนามิกขนาด 0 ไม่ได้กำหนดไว้หรือไม่
AFAIK แม้ว่าเราจะไม่สามารถสร้างอาร์เรย์หน่วยความจำคงที่ขนาด 0 แต่เราสามารถทำได้ด้วยไดนามิก: int a[0]{}; // Compile-time error int* p = new int[0]; // Is well-defined อย่างที่ฉันได้อ่านpทำหน้าที่เหมือนองค์ประกอบสุดท้ายที่จบแล้ว ฉันสามารถพิมพ์ที่อยู่ที่pชี้ไปได้ if(p) cout << p << endl; แม้ว่าฉันจะแน่ใจว่าเราไม่สามารถอ้างถึงตัวชี้ (องค์ประกอบสุดท้ายที่ผ่านมา) เนื่องจากเราไม่สามารถใช้ตัววนซ้ำ (องค์ประกอบที่ผ่านมา) แต่สิ่งที่ฉันไม่แน่ใจคือการเพิ่มตัวชี้นั้นpหรือไม่ พฤติกรรมที่ไม่ได้กำหนด (UB) เหมือนกับตัววนซ้ำหรือไม่ p++; // UB?

7
การเปรียบเทียบตัวชี้ทำงานใน C อย่างไร การเปรียบเทียบพอยน์เตอร์ที่ไม่ได้ชี้ไปที่อาเรย์นั้นเป็นสิ่งที่ดีหรือไม่?
ใน K&R (ภาษาการเขียนโปรแกรม C รุ่นที่ 2) บทที่ 5 ฉันอ่านต่อไปนี้: ขั้นแรกให้เปรียบเทียบตัวชี้ภายใต้สถานการณ์บางอย่าง ถ้าpและqชี้ไปที่สมาชิกของอาร์เรย์เดียวกันแล้วความสัมพันธ์ที่ชอบ==, !=, <, >=ฯลฯ การทำงานอย่างถูกต้อง ซึ่งดูเหมือนว่าบ่งบอกว่ามีเพียงพอยน์เตอร์ที่ชี้ไปยังอาร์เรย์เดียวกันเท่านั้นที่สามารถเปรียบเทียบได้ อย่างไรก็ตามเมื่อฉันลองใช้รหัสนี้ char t = 't'; char *pt = &t; char x = 'x'; char *px = &x; printf("%d\n", pt > px); 1 ถูกพิมพ์ไปที่หน้าจอ ก่อนอื่นฉันคิดว่าฉันจะไม่ได้กำหนดหรือบางประเภทหรือข้อผิดพลาดเพราะptและpxไม่ได้ชี้ไปที่อาร์เรย์เดียวกัน (อย่างน้อยก็ในความเข้าใจของฉัน) เป็นpt > pxเพราะพอยน์เตอร์ทั้งสองชี้ไปที่ตัวแปรที่เก็บอยู่ในสแต็กและสแต็กโตขึ้นดังนั้นที่อยู่หน่วยความจำของtมากกว่าที่อยู่x? อะไรคือสาเหตุที่pt > pxแท้จริง ฉันสับสนมากขึ้นเมื่อนำ malloc เข้ามานอกจากนี้ใน …

4
เป็นโมฆะ * ฟังก์ชั่น () ตัวชี้ไปยังฟังก์ชั่นหรือฟังก์ชั่นกลับเป็นโมฆะ *?
void *function()ฉันสับสนเกี่ยวกับความหมายของ มันเป็นตัวชี้ไปยังฟังก์ชั่นหรือฟังก์ชั่นกลับมาvoid*? ฉันมักจะใช้มันในโครงสร้างข้อมูลเป็นฟังก์ชั่นซ้ำเรียกคืนตัวชี้ แต่เมื่อฉันเห็นรหัสใน multithreading ( pthread) มีการประกาศฟังก์ชั่นเดียวกัน ตอนนี้ฉันสับสนว่าอะไรคือความแตกต่างระหว่างพวกเขา

3
C มีค่า std :: น้อยกว่าจาก C ++ หรือไม่
ฉันเพิ่งตอบคำถามเกี่ยวกับพฤติกรรมที่ไม่ได้กำหนดของการทำp < qใน C เมื่อpและqเป็นตัวชี้ไปยังวัตถุ / อาร์เรย์ที่แตกต่างกัน นั่นทำให้ฉันคิดว่า: C ++ มีพฤติกรรมเหมือนกัน (ไม่ได้กำหนด) <ในกรณีนี้ แต่ยังมีเท็มเพลตไลบรารีมาตรฐานstd::lessซึ่งรับประกันว่าจะส่งคืนสิ่งเดียวกันกับ<ที่สามารถเปรียบเทียบตัวชี้และส่งคืนการสั่งซื้อบางอย่างที่ไม่สอดคล้อง C เสนอบางสิ่งที่มีฟังก์ชั่นคล้ายกันซึ่งจะช่วยให้เปรียบเทียบตัวชี้ตามอำเภอใจ (กับประเภทเดียวกัน) ได้อย่างปลอดภัยหรือไม่? ฉันพยายามมองผ่านมาตรฐาน C11 และไม่พบอะไรเลย แต่ประสบการณ์ของฉันใน C คือขนาดที่เล็กกว่า C ++ ดังนั้นฉันอาจจะพลาดอะไรบางอย่างได้อย่างง่ายดาย

1
ความหมายของวัตถุที่ทับซ้อนกันใน C คืออะไร?
พิจารณาโครงสร้างต่อไปนี้: struct s { int a, b; }; โดยทั่วไป1 โครงสร้างนี้จะมีขนาด 8 และการจัดตำแหน่ง 4 จะเกิดอะไรขึ้นถ้าเราสร้างstruct sวัตถุสองชิ้น (แม่นยำยิ่งกว่านั้นเราเขียนลงในวัตถุสองหน่วยดังกล่าวที่จัดสรรแล้ว) โดยที่วัตถุที่สองซ้อนทับวัตถุแรก char *storage = malloc(3 * sizeof(struct s)); struct s *o1 = (struct s *)storage; // offset 0 struct s *o2 = (struct s *)(storage + alignof(struct s)); // offset 4 // now, o2 …

1
ความแตกต่างของอินสแตนซ์ constexpr สองตัวของตัวชี้ __func__ ยังคงเป็น constexpr หรือไม่
นี่คือ C ++ ที่ถูกต้องหรือไม่ int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC และ MSVC คิดว่ามันตกลงดังกราวคิดว่ามันไม่ได้: คอมไพเลอร์ Explorer ที่ คอมไพเลอร์ทุกคนยอมรับว่าอันนี้ตกลง: คอมไพเลอร์ Explorer ที่ int main() { constexpr auto p = __func__; constexpr auto p2 = p; constexpr auto sz = p2 - p; return sz; …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.