[Powered by Google Translate] [Leideanna] [Rob Bowden] [Ollscoil Harvard] [Is é seo an CS50] [CS50.TV] Ligean ar labhairt faoi threo. Suas go dtí anois, tá muid i gcónaí dá dtagraítear ach rudaí i gcuimhne go sainráite de réir ainm. Táimid tar éis a dúirt slánuimhir n = 42, agus ansin nuair a ba mhaith linn a bhaint as an n athraitheach, táimid ag glaoch díreach tar éis é an t-ainm a thabhairt dúinn é ag scríobh rud éigin cosúil le n * 2. Ach ní mór go athróg cónaí áit éigin i gcuimhne. Nuair is mian leat a bhaint as an luach a stóráiltear faoi láthair taobh istigh n, nó cothrom le dáta an luach go bhfuil n a shealbhú, Ní mór do chlár a fhios nuair i gcuimhne a chuardach le haghaidh n. Más rud i gcuimhne go bhfuil saol athraitheach ar a dtugtar a sheoladh. Tá sé cosúil le seoladh theach. Is féidir liom a fháil duine ar theach chomh fada agus a fhios agam a seoladh baile, agus is féidir le clár ríomhaire a aimsiú athraitheach chomh fada agus a fhios sé a sheoladh cuimhne. Cad leideanna ar fáil ar bhealach go díreach ag déileáil leis na seoltaí cuimhne. Tagann a lán de na cumhachta i C ó bheith in ann a ionramháil gcuimhne mar seo. Ach thagann le cumhacht mhór freagracht mhór. Is féidir le leideanna a úsáid go contúirteach go leor go bhfuil a lán de na teangacha cláir leideanna i bhfolach go hiomlán. Mar sin, cén fáth C a thabhairt dúinn leideanna ansin? Mar is eol duit, argóintí le feidhm C Tá cóip i gcónaí i na paraiméadair na feidhme. Mar sin, ag iarraidh rud éigin cosúil le babhtáil ar roinnt athróg x agus y ní féidir idirmhalartú na luachanna ar x agus y san fheidhm ag glaoch, cé go d'fhéadfadh a bheith handy. Mar beidh orainn a fheiceáil níos déanaí, babhtála athscríobh chun leideanna a ghlacadh chun an suímh gá a mhalartú ceadaíonn sé go mbeadh tionchar acu ar a ghlaoiteoir athróg. A ligean ar siúl tríd sampla réasúnta simplí ar cad is féidir leideanna a dhéanamh. Ligean le rá ní mór dúinn n slánuimhir = 4; agus o * pointer_to_n = & n. Whoa! A thuilleadh ar chomhréir nua a chlúdach. Gcéad dul síos, a ligean ar léirmhíniú seo & n. Cuimhnigh go bhfuil gach rud i gcuimhne ar roinnt seoladh. Is é an COMHARTHA AGUIS a dtugtar an "seoladh" oibritheoir. Mar sin, tagraíonn & n chuig an seoladh i gcuimhne an áit a bhfuil n stóráil. Anois, tá muid ag a stóráil an seoladh seo i athróg nua, pointer_to_n. Cad é an cineál seo athróg nua? Is é an réiltín mar chuid de athróg ar chineál, agus beidh muid ag léamh an cineál mar * slánuimhir. * Ciallaíonn Int go bhfuil pointer_to_n athróg a stórálann an seoladh slánuimhir. Tá a fhios againn go bhfuil & n an * o ós rud é go n slánuimhir, agus táimid ag cur an seoladh n. * Is Int sampla de chineál pointeoir. Chomh luath agus a thosaíonn tú ag féachaint ar asterisks sa chineál, tá a fhios agat go bhfuil tú ag déileáil le leideanna. Díreach mar is féidir linn a dhearbhú go bhfuil athróg mar slánuimhir x agus ruabhreac y, féidir linn a rá o * z agus ruabhric * w. Tá Int * agus * ruabhric ach cineálacha nua dúinn a úsáid. Is féidir leis an suíomh an * dul in áit ar bith roimh an t-ainm athraitheach. Mar sin, an dá o * pointer_to_n - leis an * in aice leis INT, mar atá againn anseo - agus o * Tá pointer_to_n leis an * in aice leis pointer_to_n bailí. Ach anseo, beidh mé cuir an * in aice le INT. Ní chuireann sé ábhar a mian leat, ach a comhsheasmhach. A ligean ar tarraing léaráid seo. Tá an chéad n athróg, rud a beidh orainn a tharraingt mar bosca beag de chuimhne. Mar shampla, seo, a ligean ar rá go bhfuil an bosca seo suite ag an seoladh 100. Taobh istigh den bhosca seo, tá muid ag a stóráil ar an luach 4. Anois, ní mór dúinn athróg nua, pointer_to_n. Tá a bhosca féin i gcuimhne, a beidh orainn a rá go bhfuil ag an seoladh 200. Taobh istigh den bhosca seo, táimid ag a stóráil ar an seoladh an n, a dúirt muid roimh 100. Go minic i léaráidí, go mbainfidh tú a fheiceáil seo a thaispeáint mar arrow litriúil ag fágáil an bosca pointer_to_n dírithe ar an bosca a stórálann n. Anois, cad is féidir linn a dhéanamh iarbhír leis pointer_to_n? Bhuel, má deirimid rud éigin cosúil le * pointer_to_n = 8, is é seo a úsáid éagsúla chun an réiltín is é sin go hiomlán ar leith ó úsáid an réiltín i dhearbhú athróg de chineál pointeoir. Anseo, tá an réiltín a dtugtar an t-oibreoir P leis na roghanna. Is é ár léaráid, cad * pointer_to_n = 8 acmhainne, téigh go dtí an pointer_to_n bosca ina bhfuil, lean an arrow, agus a shannadh ansin go dtí an bosca ag deireadh an arrow ar an luach 8. Ciallaíonn sé seo gur tar éis an líne seo, más rud é go iarracht muid a úsáid n a mbeidh an luach 8. Tá an focal 'pointeoir' a úsáidtear i go leor comhthéacsanna éagsúla. Anseo, beidh muid iarracht a bheith comhsheasmhach. Tá cineál pointeoir rud éigin cosúil le * slánuimhir. Sa físeán seo, beidh pointeoir a úsáid ach amháin go gciallaíonn luach le cineál pointeoir, cosúil le pointer_to_n atá ag * slánuimhir chineál. Áit ar bith a úsáid againn a rá ach n, is féidir linn anois a rá in ionad * pointer_to_n, agus beidh gach rud ag obair go díreach chomh maith. A ligean ar siúl tríd sampla eile simplí. Ligean le rá ní mór dúinn n o = 14; int * pointeoir = &n; n + +, agus (* pointeoir) + +. Cruthaíonn an chéad líne bosca nua i gcuimhne lipéadaithe n. An uair seo, ní bheidh muid lipéad sa bhosca le seoladh sainráite, ach tá sé fós ar cheann. Taobh istigh den bhosca, tá muid ag a stóráil ar an uimhir 14. Cruthaíonn an chéad líne eile a pointeoir an dara bosca lipéad. Agus taobh istigh den bhosca, tá muid ag a stóráil pointeoir chuig an bosca lipéadaithe n. Mar sin, a ligean ar a tharraingt ar an arrow as pointeoir go n. Anois, n + + incrimintí an luach sa bhosca lipéadaithe n, mar sin againn dul 14-15. Mar fhocal scoir, (* pointeoir) + + théann chuig an pointeoir bhosca lipéadaithe, dereferences an luach sa bhosca, rud a chiallaíonn an tsaighead a leanúint go dtí an áit pointí sé, agus incrimintí an luach a stóráil ann, mar sin táimid ag dul 15-16. Agus sin é. N siopaí anois ar an uimhir 16 tar éis bheith ar incrimintithe faoi dhó - aon uair amháin go díreach ag baint úsáide as na n-ainm athraitheach, agus an ceann eile trí pointer_to_n. Tráth na gceist tapa. Cad a cheapann tú a chiallaíonn sé má iarracht mé a rá rud éigin cosúil le && n? Bhuel, a ligean ar athscríobh seo mar & (& n) a gcomhlíonfaidh an rud céanna. An (& n) Filleann an seoladh an n athróg i gcuimhne. Ach iarracht ansin ansin COMHARTHA AGUIS seachtrach a thabhairt ar ais an seoladh ar an seoladh. Sin cosúil le ag iarraidh a dhéanamh & 2. Ní chuireann sé ciall a fháil ar an seoladh líon ach cuid ós rud é nach bhfuil sé á stóráil i gcuimhne. Ní bhíonn baint úsáide as dhá ampersands i ndiaidh a chéile an smaoineamh ceart. Ach anois, cad a chiallaíonn sé má iarracht mé a rá slánuimhir ** double_pointer = & pointeoir? Anois, tá mé ag a chruthú bosca nua lipéadaithe double_pointer, agus taobh istigh den bhosca mé a stóráil an seoladh pointeoir, rud a chiallaíonn liom a tharraingt saighead as an bhosca double_pointer chuig an bosca pointeoir. Fógra an cineál double_pointer, le ** slánuimhir. Ba N slánuimhir, pointeoir stóráilte seoladh na n, agus mar sin tá sé * slánuimhir chineál. Anois, siopaí double_pointer an seoladh pointeoir, mar sin tá sé cineál slánuimhir. ** Mar sin, cad a cheapann againn ciallaíonn sé seo - ** Double_pointer = 23? Fógra go bhfuil mé dereferencing anois faoi dhó. Just a leanúint ar an léaráid bosca-agus-arrow againn ar bun cheana. Gcéad dul síos, théann muid chun an bosca lipéadaithe double_pointer. Ciallaíonn an * chéad leanúint ar an arrow aon uair amháin. Anois, tá muid ag an pointeoir bhosca lipéadaithe. Deir an réalta an dara leanúint ar an arrow arís, agus anois táimid ag an bosca lipéadaithe n, agus atá leagtha againn ar an luach sa bhosca seo go dtí 23. Fógra go bhfuil an 'seoladh' téigh agus oibreoirí inverses a chéile. Ligeann sé seo dom a dhéanamh rud éigin cosúil le * agus * & n = 42. Cé go bhfuil an obair, ní ba chóir duit a dhéanamh rud éigin mar seo i gcleachtas. Cad tá á dhéanamh againn i ndáiríre anseo? Grabs an COMHARTHA AGUIS chéad seoladh an n athraitheach. Ansin, ní mór dúinn oibreoir téigh, rud a chiallaíonn táimid ag dul chuig an seoladh sin i gcuimhne, mar sin táimid ar ais ag n. Anois, grab muid ar an seoladh n arís agus láithreach téigh, mar sin táimid ar ais ag n agus a stóráil 42. Mar sin, gach péire de * & chealú díreach amach. Tá pointeoir speisialta ar a dtugtar an pointeoir nialasach. Is é seo an pointeoir go riamh ba chóir dúinn téigh i. Tá a leithéid de pointeoir tábhachtach toisc go dtugann sé dúinn ar bhealach chun idirdhealú a dhéanamh idir a pointeoir ba chóir nach agus ba chóir dereferenced. Má tá tú iarracht chun téigh i pointeoir nialasach, de ghnáth beidh do chlár tuairteála le locht deighilt, ar féidir leat le feiceáil roimh. Mar sin, a ligean le rá ní mór dúinn an cód slánuimhir * x = null; * x = 4. Sa sampla seo, d'fhéadfadh sé cosúil soiléir go bhfuil muid ag déanamh rud éigin dona, ach cuimhnigh go bhféadfadh null a bheith i ndáiríre luach ar ais ó glao le feidhm cosúil le malloc é, más rud é malloc in ann a leithdháileadh an chuimhne a iarrann an t-úsáideoir. Ar an gcúis sin, más rud é in ionad atá leagtha againn ar an luach de x as glaoch chun malloc, mar atá i o * x = malloc (deachúlach (o)), ansin ba chóir dúinn i gcónaí a sheiceáil go sainráite a fheiceáil má cuireadh ar ais null. Más rud é (x == null); / / uhoh! ar ais; eile is féidir linn leanúint ar aghaidh agus a rá * x = 4. Mar sin, arís, ba chóir dúinn cén fáth a úsáid riamh leideanna? Ligean ar breathnú ar shampla de chlár nuair is gá dúinn a leideanna a úsáid - feidhm babhtála simplí. Ligean le rá Tá mé dhá slánuimhreacha, slánuimhir x = 4; agus o y = 15; agus ba mhaith liom a scríobh ar a dtugtar feidhm babhtála gur féidir liom a úsáid mar seo: babhtála (x, y). Tar éis an líne seo, ba chóir go mbeadh na luachanna taobh istigh de na x athróg 15, agus ba chóir go mbeadh an luach taobh istigh y athraitheach 4. Tá na luachanna taobh istigh de x agus y curtha mhalartú. Gan threo, d'fhéadfadh muid iarracht rud éigin cosúil le babhtáil ar neamhní (slánuimhir a, slánuimhir b); slánuimhir tmp = b; b = a; a = tmp. Ach, an bhfuil tú faoi deara an fhadhb leis seo? Cuimhnigh go bhfuil an luach atá stóráilte sa an athróg is cóir cóip den luach x, agus is é an luach in b chóipeáil ón y. Ní bheidh aon athruithe a dhéantar le b agus a léiriú i x agus y. Mar sin, cé na luachanna a, b agus tá siad mhalartú i gceart, Nach bhfuil x agus y athrú ar chor ar bith. Anois, a ligean ar athrú ar an fheidhm babhtála ionas go mbeidh sé a argóintí le Tá leideanna ar na hathróga ba chóir é a mhalartú, cosúil le mar sin: babhtála ar neamhní (slánuimhir * a, o * b); int tmp = * b; * b = * a; * a = tmp. Cuimhnigh go bhfuil na hargóintí babhtálacha anois threo, agus mar sin ní mór dúinn chun pas a fháil seoladh x agus y sa ghlao a mhalartú, cosúil le mar sin: babhtála (& x, & y). Seo anois babhtálacha i gceart na luachanna ar x agus y. A ligean ar tarraing léaráid bosca-agus-arrow a fheiceáil cén fáth seo oibreacha. Tús a chur againn lenár dhá bhosca i gcuimhne, x agus y. Taobh istigh an bhosca le haghaidh x bhfuil an uimhir 4, agus taobh istigh den bhosca le haghaidh y ní mór dúinn 15. Anois, taobh istigh de na glaonna chuig an fheidhm babhtála, tá dhá boscaí níos mó do na hargóintí a agus b; pointí ar an bhosca le haghaidh x, agus pointí b ar an bhosca le haghaidh y. Tá bosca nua a cruthaíodh le haghaidh an tmp athraitheach, agus taobh istigh de é a stóráil againn ar an toradh dereferencing b, rud a chiallaíonn 'leanann an arrow as an mbosca lipéad b.' Mar sin, a stóráil muid 15 taobh istigh de tmp. Ansin, lean muid ar an arrow ar b agus a stóráil anseo mar thoradh ar dereferencing a, a bhfuil an 4 luach. Ar deireadh, lean muid ar an tsaighead ag siopa agus cad atá faoi láthair taobh istigh de tmp, a bhfuil 15. Fógra go bhfuil na boscaí lipéadaithe x agus y mhalartú i gceart luachanna. Chomh luath agus táimid ag níos mó a fhoghlaim faoi malloc agus bainistíocht cuimhne dinimiciúil, beidh orainn a fheiceáil go bhfuil muid aon rogha ach leideanna a úsáid. Ag siúl tríd an léaráid bosca-agus-arrow d'aon chlár Is féidir le cabhrú leat an figiúr amach cad é an clár a dhéanamh i ndáiríre. Is é mo ainm Rob Bowden, agus tá sé seo CS50. [CS50.TV] Is é seo an úsáid éagsúla chun an réiltín - bleah, is fuath liom an focal sin. Áit ar bith a úsáid againn a rá ach n, is féidir linn a rá anois pointer_to_n - ní can't tú - * pointer_to_n.