การส่งโครงสร้างไปยังฟังก์ชันใช้ไม่ได้ [ซ้ำกัน]
ในโค้ดด้านล่างฉันได้สร้างฟังก์ชันนอกเหนือจาก main เพื่อแบ่ง int ภายในโครงสร้างออกเป็นครึ่งหนึ่ง
หลังจากนั้นฉันต้องการพิมพ์ค่าใหม่ อย่างไรก็ตามค่าที่พิมพ์ออกมายังคงเป็นค่าแบบเก่า
ฉันเชื่อว่าความรู้พื้นฐานเกี่ยวกับโครงสร้างและตัวชี้ยังไม่ดีพอ
ใครสามารถช่วยฉันด้วยเรื่องนี้? ขอบคุณมาก!!!
typedef struct{
int age;
int wage;
}person;
void divide(person A)
{
person half;
half.age = A.age / 2;
half.wage = A.wage / 2;
A = half;
}
int main(void)
{
person A;
A.age = 30;
A.wage = 35000;
divide(A);
printf("%i\n", A.age);
}
คำตอบ
ฟังก์ชันdivide
กำลังแก้ไขสำเนาของโครงสร้างนั้นเนื่องจากโครงสร้างถูกส่งต่อโดยค่า คุณจะต้องส่งตัวชี้ไปยังโครงสร้างเพื่อให้ฟังก์ชันสามารถแก้ไขต้นฉบับได้
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
เรียกdivide
ด้วยที่อยู่ของโครงสร้างเดิม
divide(&A);
เมื่อคุณผ่านA
ไปจะdivide
มีการสร้างสำเนาA
ขึ้น การปรับเปลี่ยนภายในสำเนานี้divide
ไม่มีผลกระทบต่อตัวแปรท้องถิ่นที่คุณกำหนดไว้ในA
main
เพื่อแก้ไขปัญหานี้คุณสามารถทำให้การdivide
ใช้ตัวชี้person
ไป ตัวชี้แสดงที่อยู่ในหน่วยความจำได้อย่างมีประสิทธิภาพซึ่งคุณสามารถใช้เพื่อเข้าถึงตัวแปรท้องถิ่นที่กำหนดไว้ในฟังก์ชันอื่น ๆ ที่ไม่สามารถเข้าถึงได้ (ค้นคว้าสแต็กเฟรมหากคุณต้องการเข้าใจว่าเหตุใดจึงเป็นเช่นนั้น)
ดังนั้นในทางปฏิบัติคุณเปลี่ยนdivide
's ลายเซ็นให้กับ: void divide(person *A)
และในบรรทัดสุดท้ายของฟังก์ชั่นนี้คุณ assing ไม่A
แต่สิ่งที่A
จะชี้ไปโดยใช้ประกอบการ dereference *A = half
นี้: ในคุณmain
ฟังก์ชั่นที่คุณนั้นจากนั้นส่งที่อยู่ของA
แทนA
ตัวเองไปโดยใช้ที่อยู่ของผู้ประกอบการ:divide
divide(&A)
แก้ไข: ดียิ่งขึ้นคุณสามารถหลีกเลี่ยงการสร้างชั่วคราวhalf
โดยการดำเนินการโดยตรงA->age /= 2
และA->wage /= 2
ที่เป็นน้ำตาลประโยคสำหรับA.x
(*A).x