อะไรคือความแตกต่างระหว่าง(int*)อาเรย์,(int*)&อาเรย์และ&ตารางคู่ลำดับใน pointer มันเป็นภารกิจที่หนักมาก

0

คำถาม

ฉันมี 3 บรรทัดของรหัสนั่น performs เหมือนกันแต่กต่างรูปแบบการสั่งงานที่ฐานเป็นรหัส:

    int a, b;
    printf("Enter the size of your array [a][b]: ");
    scanf("%d %d", &a, &b);
    int arr[a][b];

    int *pa;

    pa = (int *)&arr;
     
    for (i = 0; i < a*b; i++)
    {
        printf("[%d] [%d] = ", i/b, i%b);
        scanf("%d", (pa + i));
    }

ในบรรทัด pa = (int *)&arr;ฉันสามารถเปลี่ยนเส้นนั้นก็ต้อง (int *)array, (int *)&arrayแล้ว &array โดยไม่มี encountering มีปัญหาเรื่องเดียวที่กำลังเตือนตอนสุดท้าย ฉันกำลังสงสัยที่ถูกต้องรูปแบบการสั่งงานและความแตกต่างระหว่างทั้ง 3 ของพวกเขา

arrays c pointers
2021-11-24 05:02:40
2
0
  • ที่ถูกต้องรูปแบบการสั่งงานคือ pa = &arr[0]; และถ้าคุณพบว่าตัวเองที่ต้องการจะเพิ่มเป็นทนายกำลังทำอะไรบางอย่างผิดพลาด ได้ตอบเขาได้ตรงๆเลใส่ถ้าคุณเป็นเชิดแพลตตินั่มทั้งหมดไปใช่,คุณไม่ควรจะองการคัดเลือกนักแสดงชี้ประเด็นเคยมีเลย

  • pa = &arr มันไม่ใช่"แค่ให้เป็นการเตือน"มันไม่ถูกต้องซี.นี่มันเรียกว่า constraint องการละเมิด-ไม่ถูกต้องการบ้างที่ไม่ได้พูดถึงประเด็นสำคัญ pointer ยชนิด ได้โปรดเรียน ที่คอมไพเลอร์เป็นตัวเลือกแนะนำให้ใช้สำหรับ beginners เรีย C? และ สิ่งที่ต้องเป็น C คอมไพเลอร์ทำอย่างตอนที่มันจะหาข้อผิดพลาดเกิดขึ้นระหว่าง?

  • เหมือนๆกัน, pa = (int *)&array คือการไม่ถูกต้อง pointer การแปลงระหว่างที่ไม่ได้พูดถึงประเด็นสำคัญประเภท. มันจะ compile แต่มีคอมไพเลอร์กำหนดผล. มันว่ากันตามเนื้อไม่ถูกต้องรหัสแต่อาจจะทำงานให้เจาะจงคอมไพเลอร์และระบบ

  • pa = (int *)array มันผิดสำหรับเหตุผลที่คล้ายกันเกินไป-ตั้งแต่ array มี decayed เข้า pointer ต้องตารางคู่ลำดับชนิดซึ่งไม่ได้พูดถึงประเด็นสำคัญกับ int*.

2021-11-24 10:23:55

ถ้าฉันแค่ทำอย่างพ่อ=arr;มันทำให้ฉันเป็น"[เกิดข้อผิดพลาด]งานอกจากทำงานเข้ากันไม่ pointer ประเภท". ตอนที่ฉันถามของครูสอนเกี่ยวกับมัน,นั่นคือสิ่งที่เขาต้องแสดงให้ผมดูแล้วล่ะ. ยังไงผมแค่ซ่อมมันกับของฉันรหัสฐานอยู่เหนือ?
Minh Nguyen

@MinhNguyen อาของฉันฉันไม่ได้สังเกตเห็นมันเป็น 2D อาเรย์. จะปรับปรุงคำตอบ
Lundin

Thankies จะทำให้ข้อความของสำหรับครั้งต่อไปฉันทำอะไรแบบนั้น
Minh Nguyen
0

สองกุญแจ tidbits:

  1. ที่อยู่ของอาเรย์เป็นคนที่อยู่ของมันก่ององค์
  2. ตอนที่ทำตอนเป็น pointer เป็นอาเรย์ degrades เข้า pointer ต้องของมันก่อนธาตุ

แล้ว

  1. pa = arr;
    

    คือก้อน

    pa = &(arr[0]);   // Type mismatch: RHS is int (*)[b]
    

    คุณใช้ typecast ต้องเงียบข้อผิดพลาดเมื่อทำอะไร pa = (int *)arr;.

  2. pa = &arr;
    

    คือก้อน

    pa = &(arr[0]);   // Type mismatch: RHS is int (*)[b]
    

    คุณใช้ typecast ต้องเงียบข้อผิดพลาดเมื่อทำอะไร pa = (int *)&arr;.

พวกนี้ typecasts ไม่ปลอดภัย ถ้าคุณอยากจะรักษามันเป็น 1d อาเรย์ของ int คุณค่าที่ดีที่สุดที่จะประกาศมันเป็นอย่างนั้นเหมือนกัน

2021-11-24 08:04:28

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่