[Powered by Google Translate] זאל ס רעדן וועגן סטרוקץ. סטרוקץ צושטעלן אונדז מיט אַ וועג צו גרופּע אַ בינטל פון וועריאַבאַלז צוזאַמען אין אַ פייַן פּעקל. עס ס מיסטאָמע יזיאַסט צו זען אַ בייַשפּיל רעכט אַוועק, אַזוי מיר זאָגן סטרוקט, דעריבער עפן געגרייַזלט בראַסע, און אין דעם סטרוקט, מיר וועט האָבן אַ ינט עלטער, אַ טשאַר * נאָמען, און אַז ס עס. עס קען ויסקומען טשודנע מיט אַ פּינטל - קאָמע נאָך אַ געגרייַזלט בראַסע, אָבער עס ס אין פאַקט נייטיק מיט סטרוקץ. קיין גילטיק טיפּ קענען גיין ין די סטרוקט דעפֿיניציע. דאָ, מיר ווע געניצט אַ ינט און אַ טשאַר *, אָבער איר קען אויך נוצן אַ מענגע, פון זאָגן, 100 עלעמענטן אָדער אַפֿילו אן אנדער סטרוקט. ווען איר ניטאָ ניצן סטרוקץ אין C, איר ניטאָ שאפן נייַ טייפּס אויס פון אַ זאַמלונג פון אנדערע טייפּס. דאָ, מיר רע מאכן אַ נייַ טיפּ אויס פון אַ ינטעגער און אַ טשאַר *. ווי מיר וועט זען שפּעטער, אַ סטרוקט טיפּ איז אין אַ פּלאַץ פון וועגן עקוויוואַלענט צו קיין אנדערע טיפּ איר ניטאָ געניצט צו. יוזשאַוואַלי, איך וועט זייַן קאַמפּערינג ווי אַ סטרוקט טיפּ איז ענלעך צו אַ ינטעגער טיפּ. בשעת די קאָד מיר געשריבן איז גילטיק C, עס ס ניט זייער נוצלעך, און קלאַנג וועט געבן אונדז אַ ווארענונג. געדענקען ווי סטרוקץ און זייַן זענען ענלעך? נו, מיר בייסיקלי נאָר געזאגט ינט, וואָס איז ניט אַ זייער נוציק שורה. אַזוי לאָזן ס פאקטיש דערקלערן אַ בייַטעוודיק פון וואָס טיפּ דורך געבן עס אַ נאָמען פאר דעם פּינטל - קאָמע. מיר וועט רופן די בייַטעוודיק תּלמיד. איצט מיר ווע דערקלערט אַ בייַטעוודיק גערופן תּלמיד מיט דעם טיפּ געגעבן דורך די סטרוקט. ווי טאָן מיר באַקומען צו דעם וועריאַבאַלז ין די סטרוקט? טעקניקלי, די נעמען פֿאַר די וועריאַבאַלז זענען מיטגלידער. צו צוטריט קיין באַזונדער מיטגליד אין אַ תּלמיד סטרוקט, איר צוגעבן אַ פּינטעלע צו די בייַטעוודיק נאָמען, נאכגעגאנגען דורך די נאָמען פון די מיטגליד איר ווילן. אַזוי דאָ, די בלויז 2 גילטיק פּאַסאַבילאַטיז זענען סטודענט.אַגע און student.name. און מיר קענען טאָן עפּעס ווי סטודענט.אַגע = 12 און student.name = תּלמיד. איצט וואָס אויב מיר געוואלט צו מאַכן אַ רגע תּלמיד? איר זאל טראַכטן צו צייכענען און פּאַפּ די שורות און טוישן תּלמיד צו תּלמיד 2 אָדער עפּעס, און וואָס וועט אַרבעטן, אָבער טעקניקלי, תּלמיד און תּלמיד 2 טאָן ניט האָבן די זעלבע טיפּ. זען, איר וועט נישט זייַן ביכולת צו באַשטימען זיי צו איינער דעם אנדערן. דאס איז ווייַל, אַזוי ווייַט, דיין סטרוקט האט שוין אַנאָנימאָוס. מיר דאַרפֿן צו געבן אים אַ נאָמען. צו טאָן וואָס, מיר אַרייַנלייגן די נאָמען פון די סטרוקט נאָך די וואָרט סטרוקט. תּלמיד, נאכגעגאנגען דורך די דעפֿיניציע. מיר קענען נאָך מיד דערקלערן אַ בייַטעוודיק פון טיפּ סטרוקט תּלמיד, ווי מיר האבן פריער. מיר וועט רופן עס ס 1 דורך געבן די סטרוקט אַ נאָמען, מיר קענען איצט נוצן סטרוקט תּלמיד אין כּמעט די פּינטלעך זעלבע וועג מיר וואָלט נוצן ינט. אַזוי מיר קענען דערקלערן אַ בייַטעוודיק פון טיפּ סטרוקט תּלמיד, ווי סטרוקט תּלמיד ס 2. ווי ערייז, סטרוקץ צושטעלן אַ דורכוועג יניטיאַליזאַטיאָן סינטאַקס, אַזוי מיר קענען זאָגן, סטרוקט תּלמיד ס 2 יקוואַלז לינקס געגרייַזלט בראַסע 3, ס 2. דאָ, ס2.אַגע וועט זייַן 3, און S2.name וועט פונט צו ס 2. טראַכטן פון אַלע די זאכן איר קענען טאָן מיט אַ ינט טיפּ און רובֿ פון זיי איר קענען טאָן מיט אַ סטרוקט תּלמיד טיפּ. מיר קענען נוצן אַ סטרוקט תּלמיד ווי אַ טיפּ פון אַ פֿונקציע פּאַראַמעטער. מיר קענען נוצן סטרוקט תּלמיד ין פון אַ נייַ סטרוקט. מיר קענען האָבן אַ טייַטל צו אַ סטרוקט תּלמיד. מיר קענען טאָן גרייס פון סטרוקט תּלמיד. סטרוקט תּלמיד איז אַ טיפּ פּונקט ווי ינט איז אַ טיפּ. מיר קענען אויך באַשטימען ס 1 צו ס 2 זינט ביידע זענען פון די זעלבע טיפּ, אַזוי מיר קענען טאָן ס 1 = ס 2. וואָס כאַפּאַנז אויב מיר טאָן ס1.אַגע = 10? טוט ס 2 טוישן בייַ אַלע? ווידער, טראַכטן פון די סטרוקץ נאָר ווי רעגולער ינטאַדזשערז. אויב מיר באַשטימען עטלעכע ינט X צו עטלעכע ינט י, ווי רענטגענ = י און דעמאָלט טוישן רענטגענ, ווי אין X + +, טוט י טוישן בייַ אַלע? י טוט נישט טוישן דאָ, און אַזוי ניט טוט ס 2 אויבן. ס2.אַגע איז נאָך 3. אבער טאָן אַז ווען אַסיינינג איינער סטרוקט צו אנדערן, אַלע פון ​​די פּוינטערז נאָך פונט צו די זעלבע זאַך, זינט זיי זענען נאָר קאַפּיד. אויב איר טאָן ניט וועלן די פּוינטערז צו זייַן שערד, איר וועט דאַרפֿן צו מאַניואַלי שעפּן אַז, טאָמער דורך מאַליקקינג איין בלאָק פון זכּרון פֿאַר איינער פון די פּוינטערז צו פונט צו און קאַפּיינג די דאַטן איבער. עס זאל זייַן אַנויינג צו האָבן צו שרייַבן סטרוקט תּלמיד אומעטום. ניצן אַ טיפּ דעף, מיר קענען טאָן טיפּ דעף סטרוקט און מיר וועט רופן עס תּלמיד. איצט, מיר קענען נוצן תּלמיד אומעטום אַז מיר געניצט צו נוצן סטרוקט תּלמיד. דאס טיפּ דעף ס אַ אַנאָנימאָוס סטרוקט און רופט עס תּלמיד. אבער אויב מיר אויך האַלטן דעם תּלמיד יידענטאַפייער ווייַטער צו די וואָרט סטרוקט, ווי אין טיפּעדעף סטרוקט תּלמיד, מיר קען נוצן ביידע סטרוקט תּלמיד און תּלמיד ינטערטשיינדזשאַבלי איצט. זיי טאָן ניט אַפֿילו האָבן צו האָבן די זעלבע נאָמען. מיר קען טיפּ דעף סטרוקט תּלמיד צו באָב און דעמאָלט סטרוקט תּלמיד און באָב וואָלט זייַן ינערטשיינדזשאַבאַל טייפּס. ראַגאַרדלאַס פון די טיפּ דעף, מיר דאַרפֿן די יידענטאַפייער ווייַטער צו סטרוקט אויב די דעפֿיניציע פון ​​די סטרוקט איז רעקורסיווע. פֿאַר בייַשפּיל, טיפּ דעף סטרוקט נאָדע און עס וועט זייַן דיפיינד ווי אַ ינט וואַל און עס וועט האָבן אַ טייַטל אַז פונקטן צו אן אנדער סטרוקט נאָדע., ווי אין סטרוקט נאָדע * ווייַטער. און דעמאָלט מיר וועט רופן עס נאָדע. דאס סטרוקט איז רעקורסיווע, זינט די דעפֿיניציע פון ​​סטרוקט נאָדע כּולל ין עס אַ טייַטל צו אַ סטרוקט נאָדע. נאָטיץ וואָס מיר האָבן צו זאָגן סטרוקט נאָדע * ווייַטער ין פון די דעפֿיניציע פון ​​די סטרוקט נאָדע, זינט די טיפּ דעף האט נישט פאַרטיק נאָך צו לאָזן אונדז צו פאַרפּאָשעטערן דעם צו נאָר נאָדע * ווייַטער. איר וועט לערנען מער וועגן סטרוקץ ענלעך צו דעם ווען דילינג מיט לינגקט רשימות און ביימער. וואָס וועגן סטרוקץ אין אַ פֿונקציע? דאס איז אויך בישליימעס גילטיק. מיר קען האָבן פּאָסל פונק וואָס נעמט ווי אַן אַרגומענט, תּלמיד s און טוט עפּעס מיט וואָס תּלמיד. און דעמאָלט מיר קענען פאָרן עס ווי תּלמיד סטרוקט ווי אַזוי. פונק פון ס 1 פון פריער. די סטרוקט ביכייווז פּונקט ווי אַ ינטעגער וואָלט ווען דורכגעגאנגען צו אַ פֿונקציע. פונק נעמט אַ קאָפּיע פון ​​ס 1 און אַזוי קענען נישט מאָדיפיצירן ס 1; אלא, נאָר די קאָפּיע פון ​​אים אַז ס סטאָרד אין ש אויב איר ווילן די פֿונקציע צו זייַן ביכולת צו מאָדיפיצירן ס 1, פונק וועט דאַרפֿן צו נעמען אַ תּלמיד * א, און איר וועט האָבן צו פאָרן ס 1 דורך אַדרעס, ווי אַזוי. תּלמיד * ז, פונק & ס 1. עס ס אן אנדער סיבה צו פאָרן דורך אַדרעס דאָ. וואָס אויב אונדזער סטרוקט קאַנטיינד 100 פעלדער? יעדער איין מאָל מיר פאָרן אַ תּלמיד צו פונק, אונדזער פּראָגראַם דאַרף צו קאָפּיע אַלע פון ​​יענע 100 פעלדער אין פונק ס אַרגומענט א, אַפֿילו אויב עס קיינמאָל ניצט די וואַסט מערהייַט פון זיי. אַזוי אַפֿילו אויב פונק טוט נישט פּלאַן אויף מאַדאַפייינג דער תּלמיד, אויב קענען נאָך זייַן ווערטפול צו פאָרן דורך אַדרעס. אָוקיי, וואָס אויב מיר ווילן צו שאַפֿן אַ טייַטל צו אַ סטרוקט? מיר קען טאָן עפּעס ווי תּלמיד * ד יקוואַלז מאַללאָק גרייס פון תּלמיד. נאָטיץ אַז גרייס פון נאָך אַרבעט דאָ. אַזוי ווי טאָן מיר איצט צוטריט די עלטער מיטגליד פון דעם בלאָק וואָס ז פונקטן צו? איר זאל ערשטער טראַכטן צו טאָן * ס.אַגע = 4, אָבער דאָס וועט נישט גאַנץ אַרבעט. זינט דעם וועט טאַקע זייַן ינטערפּראַטאַד ווי * ס.אַגע אין קלאַמערן = 4, וואָס וועט ניט אַפֿילו צונויפנעמען, זינט ד איז נישט אַ סטרוקט אָדער אלא אַ טייַטל צו אַ סטרוקט, און אַזוי די פּינטעלע וועט נישט אַרבעטן דאָ. מיר קען טאָן (* ז). עלטער = 4 אָבער די קלאַמערן קענען באַקומען אַנויינג און קאַנפיוזינג. טהאַנקפוללי, מיר האָבן אַ ספּעציעל פייַל אָפּעראַטאָר וואָס קוקט עפּעס ווי ד-> עלטער = 4. די 2 וועגן פון רעפעראַנסינג עלטער זענען עקוויוואַלענט און מיר טאָן נישט טאַקע אלץ דאַרפֿן די פייַל אָפּעראַטאָר, אָבער עס מאכט דאס קוקן ניסער. זינט ז איז אַ טייַטל צו עטלעכע בלאָק פון זכּרון אַז כּולל די סטרוקט, איר קענען טראַכטן פון ד> עלטער ווי נאָכפאָלגן די טייַטל פייַל און כאַפּן די עלטער מיטגליד. אַזוי וואָס זאָל מיר אלץ נוצן סטרוקץ? עס ס באשטימט מעגלעך צו באַקומען אַוועק מיט נאָר די פּרימיטיוו ינטאַדזשערז, טשאַרס, פּוינטערז און די ווי אַז מיר רע געניצט צו; אַנשטאָט פון ס 1 און ס 2 פריער, מיר קען האָבן געהאט אַגע1, אַגע2, נאַמע1, און נאַמע2 אַלע בייַ באַזונדער וועריאַבאַלז. דאס איז פייַן מיט נאָר 2 סטודענטן, אָבער וואָס אויב מיר האבן 10 פון זיי? און וואָס אויב אַנשטאָט פון בלויז 2 פעלדער, דער תּלמיד סטרוקט האט 100 פעלדער? גפּאַ, קאָרסאַז, האָר קאָלירן, דזשענדער, און אַזוי אויף. אַנשטאָט פון נאָר 10 סטרוקץ, מיר דאַרפֿן 1.000 באַזונדער וועריאַבאַלז. אויך, באַטראַכטן אַ פֿונקציע וואָס נעמט אַז סטרוקט מיט 100 פעלדער מיט זייַן בלויז אַרגומענט און פּרינץ אויס אַלע פעלדער. אויב מיר האבן נישט נוצן אַ סטרוקט, יעדער איין מאָל מיר רופן אַז פונקציאָנירן, מיר דאַרפֿן צו פאָרן אין אַלע 100 וועריאַבאַלז, און אויב מיר האָבן 100 וועריאַבאַלז פֿאַר תּלמיד 1, און 100 וועריאַבאַלז פֿאַר תּלמיד 2, מיר דאַרפֿן צו זייַן זיכער מיר טאָן ניט אַקסאַדענאַלי פאָרן עטלעכע וועריאַבאַלז פון תּלמיד 1 און עטלעכע וועריאַבאַלז פון תּלמיד 2. עס ס אוממעגלעך צו מאַכן אַז גרייַז מיט אַ סטרוקט, זינט אַלע 100 וועריאַבאַלז זענען קאַנטיינד אין אַ איין פּעקל. נאָר אַ פּאָר פון לעצט הערות: אויב איר ווע פארשטאנען אַלץ אַרויף צו דעם פונט, גרויס. די מנוחה פון די ווידעא איז נאָר פֿאַר קאַמפּליטנאַס 'צוליב. ווייַל סטרוקץ קענען האַלטן קיין טיפּ פון טייַטל, זיי קענען אויך האַלטן פונקציאָנירן פּוינטערז. אויב איר ניטאָ באַקאַנט מיט כייפעץ אָריענטיד פּראָגראַממינג, דאָס גיט אַ וועג צו נוצן סטרוקץ צו פּראָגראַם אין אַ כייפעץ אָריענטיד נוסח. מער אויף פונקציאָנירן פּוינטערז אין אן אנדער צייַט. אויך, מאל איר זאלט ​​האָבן 2 סטרוקץ וועמענס זוך אָפענגען אויף איין אנדערן. פֿאַר בייַשפּיל, מיר קען האָבן סטרוקט א, וואָס איז דיפיינד ווי אַ טייַטל צו אַ סטרוקט ב, סטרוקט ב * רענטגענ, און איצט מיר קענען האָבן אַ סטרוקט ב וואָס איז דיפיינד ווי אַ טייַטל צו אַ סטרוקט א, סטרוקט א * וויי אבער דאָס וועט נישט צונויפנעמען, זינט סטרוקט ב טוט נישט עקזיסטירן אין די צייַט וואָס סטרוקט א איז זייַענדיק צונויפגעשטעלט. און אויב מיר ויסבייַטן סטרוקט א און סטרוקט ב, דעמאָלט מיר 'ד נאָר זייַן לינקס מיט די זעלבע פּראָבלעם; דאָס מאָל, מיט סטרוקט א נישט שאַפֿן. צו סאָלווע דעם, מיר קענען שרייַבן סטרוקט ב; איידער די דעפֿיניציע פון ​​סטרוקט יי דאס איז גערופן אַ פאָרויס דערקלערונג. דאס נאָר לעץ דער קאַמפּיילער וויסן אַז סטרוקט בייטן איז אַ גילטיק טיפּ וואָס וועט זייַן גאָר דיפיינד שפּעטער אָדער אנדערש. מייַן נאָמען איז ראָב באָוודען, און דאָס איז קס50. [CS50.TV]