 اسلام علیکم Today's lecture 30 of CS201 Introduction to Programming آج کا ہمارا topic جو ہے وہ references کے بارے میں ہے This is a very very important topic from the C++ perspective because آگے چلکے اس نے بہت استعمال ہونا ہے آج ہم references کو introduce کریں گے اور بتائیں گے ان کا استعمال کیا ہے اور یہ تقریباً pointers کی طرح کی ایک چیز ہے لیکن pointers اور references میں فرق کیا ہے اور پھر ہم ان کا ایک beginning والا یعنی ایک beginner کے perspective سے ان کا استعمال جو ہے اس کے بارے میں بات کریں گے سو لیٹس talk about references what are they C++ ایک چیز دفائن کرتی ہے جسے ہم ایک کسم کا alias یا synonym کر سکتے ہیں کسی بھی دیتا طاپ کے لیے اس synonym کو ہم یہ reference کا نام دیتے ہیں how do we declare a reference we declare it by using an ampersand operator اب یہ تھوڑے سے confusing ہوگی کہ and sign جو ہے یہ ہم نے استعمال کیا تھا for the address of operator اور یہاں پہاں ہم اس کا ایک second meaning لا رہے ہیں but as you have seen there are several things with double meanings in this language so reference جو ہے وہ بھی and sign کے ساتھ declare کیا جاتا ہے what does it how do we do that we write something like int and i what this statement means i is a reference to an integer keep that statement very clear جتی بھی ہم declarations کرتے ہیں میں نے آپ کو pointers کے بارے میں بھتایا تھا it is easier to read them from right to left if I say int star i we read it as i is a pointer to an integer اب ہم کہہ رہے ہیں int and i we are saying i is a reference to an integer so یہ ریفرنس چیز کیا ہے a reference as I mentioned earlier is a synonym یہ نہیں ایک ہی چیز کے اگر دو نام دینے ہو تو اس وقت ہم ریفرنس استعمال کرتے ہیں so reference جو ہے it has to be initialized جب آپ اس کو declare کرتے ہیں کہ جناب یہ کونسی چیز ہے جس کا یہ بھی نام ہوگا so for example if you had an integer called j and you wanted to declare a second name for the same integer for the moment we are not going to worry about کیوں یہ ضرورت پیش آئے گی لیکن آگے چال کے بعد کلیر ہوتی جائے گی so if we had an integer i and we wanted to declare a reference to this integer and call that reference j we would write something like int and j equal to i semicolon so reference ہم نے declare کیا اور ساتھ ہی اس کو initialize کر دیا saying کہ یہ i کا دوسرا نام ہے now does it mean it creates a new variable answer is no it's not creating a new variable it's just a new name for a variable that already existed so if you try to manipulate i and j you will come to know that you are manipulating only one number let us take a look at a very simple example suppose آپ یہ ایک پروگرم لکھیں اور اس میں یہی یہاں سے شروع کرتے ہیں main کے ساتھ int i اور پھر ہم کہتے ہیں int and j equal to i so we have declared an integer i and j as a reference to an integer initialized with the value of i اب ہم کہتے ہیں i is equal to 123 see out کے ساتھ آپ i کی value پرنٹ کر سکتے ہیں 123 نظر آئے گی now try to print the value of j so we write see out less than less than j notice میں نے and sign استعمال نہیں کیا this is one powerful feature کہ جی وہ declaration کے وقت آپ نے بتا دیا یہ reference ہے اس کے بعد جہاں پے بھی آپ اس کو استعمال کریں گے وہاں پہ آپ کو پھر سے reference operator استعمال کرنے کی ضرورت نہیں ہے in fact your reference operator نہیں ہے it's more like a reference declarator یہ declare کرتا ہے reference کو استعمال میں ہم اس کو نہیں لاتے so if we say see out less than less than j you will notice کہ وہی value جو i کو ہم نے اسان کی تھی وہ print ہوتی ہے 123 what happens if we increment i ہم کہتے ہیں i++ اور پھر ہم یہی دونوں لائنے repeat کرتے ہیں کہ i کی value print کرو تو وہ کہہ گا 124 now we say see out less than less than j you will again see کہ جی 124 ہی print ہو رہی ہے یعنی i کو increment کیا تو جی جو ہے وہ خود ہی increment ہو گیا ہوئے وجہ پھر دونوں ایک ہی location کو تو point کر رہے ہیں they are both referring to the same location in memory j is just another name for i اس کو لیکے ہم آگے چلتے ہیں کہ جی اس کا کیا فائدہ ہے اور کہاں پہ استمال ہوتا ہے references جو ہے یہ میں آپ کو اگر دیا کہ they are synonyms and they are just not restricted to ints you can have synonym for any data type in fact you can have a synonym for a class class کا بھی آپ reference لے سکتے ہیں استمال ان کا کہاں پہ ہوتا ہے let's jump backwards a little bit in time and go back to one of my favorite functions which we used to show you the use of pointers ہم نے کہا تھا کہ جی ایک common programming construct ہے کہ جی دو نمبرز کو آپس میں interchange کرنا swap کرنا تو اگر ہمار پہس دو integers ہیں x اور y اور ہم چاہتے ہیں کہ جی x میں y کی value آجائے اور y میں x کی value چلی جائے تو ایک طریقہ تو ہے کہ program کے اندر ہی لکھ دیا a temporary variable لے لیا temp اس میں کہا دیا temp is equal to x x is equal to y y is equal to temp واقعوں کی value's انٹر چینگ ہو گئی اگر ہم اس کو کرنا چاہیں interchange ا یا سوپ کرنا چاہیں using a function اگر ہم بچوں کی طریقہ یہ سوپ function لیکن کہ swap x comma y اور في فنکشن میں جاکے ہم کہیں int temp temp is equal to x x is equal to y y is equal to temp end of function کیا ہوگہ do you realize کیا ہوگا کچھ بھی نہیں ہوگا. Why? The reason is call by value. C اور C++ کا رول جو ہے وہ ہے call by value. So جب مین فنکشن کال کرتا ہے swap x comma y تو x کی value اور y کی value جو ہیں وہ swap فنکشن کو پاس کر دی جاتی ہیں اب ان کے ساتھ سوپ فنکشن جو مرزی کرے. Original variables جو تھے ہمارے پروگرم میں یعنی x اور y ان کو کچھ نہیں ہو رہا. So the swap فنکشن انٹر چینج the values but that انٹر چینج was local to that function. It did not affect anything in the main یہ جب واپس آیا مین میں تو original x and y کی values وہی کی وہی پڑی ہوئی ہیں. So what did we do? We said to execute an actual swap function. We have to do a call by reference. Notice اس وقتی ہم نے call by reference کہا تھا اور آج کا topic ہی references ہے. Call by reference کیلئے ہم نے کیا کیا تھا. ہم نے کہا تھا جی اب x اور y نہیں بھیجنے swap فنکشن کو. x اور y کی addresses بھیجنے ہیں اور addresses کیلئے ہم نے address operator استمال کیا تھا. So now we in the main function we called swap and x comma and y. What this did was x کا address لو اور y کا address لو اور اب یہ addresses یہ swap فنکشن کو بھیج دو. Swap فنکشن کی prototype کیا تھی. Swap فنکشن now said کہ جی اب مجھے دو pointers مل رہے ہیں to integers. So I said اس کی prototype کیا اس کی definition was swap انٹ سٹار آئی کاما انٹ سٹار جے کینی I and J are now pointers to integers. اس کے بعد ہم نے ان کو manipulate کیا using the star notation which is dereferencing a pointer whatever I points to اس میں جے کی جو whatever J points to وہ value ڈال دو and so on. It was clumsy but it worked. Addresses بھیجے. Addresses سے کہ جی memory کا address ہم نے بھیج دیا. So now اپس میں جو memory میں جو چیزیں لکھی ہوئی ہیں ان کو اپس میں interchange کر دو. جب وہ interchange کر کے swap فنکشن مین فنکشن میں واپس آیا تو کیا ہوا کیونکہ ہم نے memory میں چیزیں جو لکھی ہوئی تھی ان location کو interchange کیا تھا. تو main function میں بھی x or y interchange ہمیں ملے. But as you will agree this notation of taking the address and then passing it to a function and telling the function کہ you are receiving pointers اور پھر constantly pointers کو dereference کرنا star operator کے ساتھ this was clumsy and not elegant اس کے لیے ہم یہ reference بڑی اسانی سے استعمال کر سکتے ہیں. Let us see how it is done. Let us do that by rewriting our swap function to use references اب swap function کچھ اس طرح سے لکھا جاتا ہے swap int and i comma int and j اس لین کو آپ پڑی swap is a function that receives two arguments i is a reference to an integer and j is a reference to an integer اب calling function سے references یہاں ہمیں کسی طریق سے پہنچانے ہیں اس کے بعد function کی body میں کیا لکھیں یہ آتی ہے reference کی elegance کی بعد body کے اندر آپ اس طرح سے ان کو ٹریٹ کریں گے i اور جے کو جیسے یہ ordinary integers تھے. So وہی ہم نے int temp ایک local temporary integer variable declare کیا ہم نے کہا temp equals i i equals جی جی equals temp return یعنی function ختم return statement لکھنے کی ضرورت نہیں ہے when this happens the calling function in this case main will automatically find کی جی دو نمبر جو دو انٹیجر ہم نے swap کو بھیجے تھے وہ اپس میں interchange ہوئے بھی لیکن ابھی ہم نے اس کی بات نہیں کی کی جی call کرنا کیسے ہے second part of the beauty پہلے beauty یہ تھی کہ swap کی body کی اندر ہم نے i اور جے کو ordinary i اور جے لکھا کوئی and نہیں لگایا کوئی star نہیں لگایا کچھ نہیں we treated them as ordinary integers by knowing that swap received two references to integers main function میں you just write swap x comma y x اور y اگر integers ہیں اس کو سمپل آپ لکھیں گے swap x comma y that's it it's an ordinary call لیکن function جو ہے وہ کہتا ہے مجھے references مل رہے ہیں so automatically وہ addresses والا حصہ جو ہے وہ بیچ میں شامل ہو جاتا ہے ان کے references ملتے ہیں which means addresses to the original numbers جہاں پہ بھی میمری میں پڑے بے وہ original numbers کی location یہاں پہ چلی گئیں آپ جا بھی ہم کو ہم نے function کی اندر manipulate کیا تو original numbers اپس میں interchange ہو رہیں so when we come back we find swap has worked this is one beautiful example جہاں پہ وہ ساری کمبر سمجھو تھی pointer notation اسے ہماری جان چھوٹکے لیکن کوئی downside ہے again my favorite phrase nothing comes for free کوئی نا کوئی downside ضرور ہوتی ہے in this case اب main function کو اگر آپ پڑھ رہے ہوں تو اس میں آپ کو نظر آئے گا swap x comma y یہ لگے گا کہ یہ call by value ہے because that is the rule for c and c plus plus if you call a function اور اس کو دو integer variables pass کرتے ہیں تو it has a call by value so you will have to look for the definition of the swap function to realize کہ یہ call by value نہیں ہے یہ call by reference ہو رہی ہے so ایک second step کرنا پڑتا ہے otherwise program جو ہے وہ لکھنا زیادہ آسان ہے دوسری چیز کہ جی یہاں پہ اگر آپ دیکھیں کہ اگر آپ کے پاس ایک اور سوپ function ہوتا جو کہ دو انٹیجرز رسیب کرتا تو can we say کہ جی swap انٹ کمہ انٹ اور سوپ انٹ انٹ کمہ انٹ انٹ any one function receives two integers and the other function receives two references to integers can we do that types are different if they are different we can overload right unfortunately not کیوں main function کو دیکھیں جو ordinary تھا swap انٹ کمہ انٹ اس کو call کرنے کا طریقہ مین میں ہوگا swap x comma y جو reference والا تھا اس کو call کرنے کا طریقہ میں ابھی بتایا وہ ہی ہے swap x comma y how does the compiler know کہ جناب آپ ordinary integer والا swap function call کر رہے ہیں یا reference والا call کر رہے ہیں ا پیر میں ہو جانتے ہیں پس کمہ انٹ کمین کے ساتھ ہوتے ہیں اور پقي بکاد ہے بہت ہی جانتے ہیں پصرا ہی کوئی مسئلہ کیا ذہب لیگتے ہیں تو ایک ساتھ ہاں دیکھنے کی کوئی آجی ہے کیا آپ کو ایک call کریں لوگی لیکنے کیا ایک call環یپورنس کی تقومت بھائے جو یہاں پہلے ایک سامپہ لیکھے چلا تھا سوپ اس میں ہم چاہتے تھے کہ جو اوریڈنل دو نمبر ہیں وہ اپس میں انٹر چینج ہو جائیں لیکن کوئی ایسی سیچویشن ہے جہاں ہم بھیجنا بای ریفرنس چاہیں لیکن ہم یہ نہ چاہیں کہ اوریڈنل ڈیٹا کو کچھ ہو دیس سیچویشن ارائز when we want to pass something like a large data structure to a function to understand this concept we have to understand کجی function call execute ہوتی کیسے ہے یہ ہم پہلے بھی بات کر چکے ہیں آئے اس کو ذرسا ریکاب کرتے ہیں اور تھوڑا سا سمجھتے ہیں real world میں چلے جاتے ہیں suppose میں کتاب کھولی ہوئی ہے میں کچھ پڑھ رہا ہوں پڑھتے پڑھتے مجھے نظر آئے کہ جناب یہ word کوئی special آگیا ہے اس کو مجھے look up کرنا پڑھے گا تو میں اپنا کام وہاں روک دیتا ہوں کتاب میں کوئی marker لگاتا ہوں پھر اس لفظ کو لے کے میں جاتا ہوں انسیکلو پیڈیا یا دکشنری کی طرف دیفنیشن دھونتا ہوں وہ دیفنیشن دھوننے کے اندر مجھے پتہ چلتا ہے کہ جی کوئی اور موٹا سا لفظ آگیا اس کی بھی سمجھنی آئی چلو جی وہاں پے marker لگاو اس نئے لفظ کی دیفنیشن دھوننے چلے جاؤ eventually سارے لفظ جو مجھے نظر آئے تھے ان کی مجھے سمجھ آ گئی اب کرنا کہ ہم نے واپس جانا ہے جہاں پہ ہم نے اپنی original study چھوڑی تھی وہاں پہ so what I do is I close the last encyclopedia I close the last dictionary ایستہ ایستہ کر کے میں وہ چیزیں سائد پر اکتا جا رہا ہوں eventually مجھے وہاں کتاب مل جاتی ہے جہاں سے ہم نے شروع کیا تھا وہاں پے marker رکھا ہوا تھا اب مجھے ساری چیز کے سمجھا گی ایک لفظ کے پیچھے ہم نے کافی سفر کیا if you think about it this was a function call ہم ایک کام کر رہے تھے certainly ہم نے ایک function call کیا تو اس کام کو روک دیا اور execution کہیں اور چلی گئی اور پھر چلتے چلتے وہ جب execution function کی ختم ہوئی تو ہم واپس آئے اور original function کو لے کے آگے چلے کمپیوٹرز یہیں یہی کام سٹیک کے ذریعے کرتے ہیں تو program جب واپس آتا ہے function سے اس کو معلوم ہونا چاہئے کہ میں کہاں پے تھا اور میں نے آگے کیا کرنا ہے یہ تو سمپل بات ہے bookmark لگا دیا ایک reference رکھ دیا لیکن ساتھ وہ data بھی سیف کرنا پڑتا ہے کہ سارے variables کی values کیا تھیں instruction pointer کہاں پہ تھا etc. that's a side issue issue یہ ہے کہ میں نے آپ کو اگر دیا ایک لفز کے look up کا suppose وہ ایک لفز نہیں تھا وہ لفز جو تھا وہ بزاتے خود ایک کتاب نکلائی now to look up that book یعنی ایک reference کتاب میں آ جاتا ہے کہ see so and so book اب اس reference کو دھوننے کے لیے میں چلوں اور ایک اور کتاب اور ایک اور کتاب think about it this way کہ ایک لفز کو look up میں کرنے نہیں جا رہا میں ایک پورے paragraph کو یا ایک پورے essay کو look up کرنے جا رہا ہوں یہ کس نے کہا تھا کس context میں کہا تھا اس کا مطلب کیا ہے before I can continue my studies what I have to do is I have to take that entire paragraph with me or that entire essay with me to go and do a look up think about the stack وہی stack کے اوپر original program کی تو condition save ہوگی its called state کہتے ہیں state save ہوگی لیکن اب اس کے اوپر ہم نے پورا essay یا paragraph رکھ دیا اور پھر جاکہ آپ نے دوسی کتاب کھولی اور پھر یہ essay اٹھا کے اس کتاب میں سرچ کیا اور اس کا reference اور آگے پیچھے دیکھنے لگ پڑے what I'm trying to say is کہ یہ جو چیز ہم نے main program سے function کو pass کی وہ بزاتے خود بہت بڑی تھی so there was a big overhead in writing that thing out into a temporary space in memory and then going and then picking it up and looking it up can we make things a little more efficient issue یہ ہے کہ اس look up کے اجامل کے اندر جو essay یا paragraph کا میں ذکر کر رہا ہوں جس کو ہم لے کے چلے اور کہیں ڈھوننے لگے ہیں اس essay یا paragraph کو تو ہم change نہیں کرنا چاہتے we only want to look it up کہا تھا کس نے کہا کس context میں کہا اس کا مطلب کیا بنتا ہے ہم صرف اس کو استعمال کرنا چاہتے ہیں لیکن اس کے الفاظ کو تبدیل نہیں کرنا چاہتے unfortunately اس کے ساتھ جو بیگے جا رہا ہے کہ جی پہلے اتنا بڑا اس کو copy بناو اور پھر copy لے کے آگے چلو اور جب کام ختم ہوا copy کو پھیک دو اور پھر اپنا original کام پھر سے کرنا شروع کر دو that was inefficient but اگر میں reference لے کے چلتا یعنی اس کا address پاس کر دیتا اور اپنے function میں چلا جاتا اب اس کو look up کرو تو address کے ساتھ ایک danger بھی ساتھ آتا ہے کہ جی وہ پرتے پرتے میں نے کہا اس کی سمجھ آگی اس کی سمجھ آگی اس کی سمجھ آگی اور میں وہاں پر لائنے لگانی شروع کر دیں اس اسے کے اندر جب میں واپس آئے اور آگے پڑھنے لگا تو پتہ چلا کہ جی میری original کتاب کے اندر بھی لائنے لگی ہوئی ہے pen کے ساتھ انفارٹنٹی لیبرری میں اگر آپ کتابیں اٹھائیں تو بہت ساری کتابوں میں آپ کو pen سے لائنے لگی ہوئی نظر آئیں گی that in a way is exactly what happened you pass something by value or rather you pass something by reference and by passing the reference you actually pass the original any think about it another way آپ ایک لیبرری جاتے ہیں اور وہاں سے کہتے ہیں کہ جی مجھے یہ بک draw کرنے کی جازت دیں میں اس کو گھر لجاکے پرنا چاہتا ہوں سپوز وہ بک one of a kind ہے دنیا میں ایک ہی نُسخہ ہے اس کتاب کا لیبرریین تو آپ کو کبھی نیوز بک کو ہاتھ لگانے دے گا کہے گا بھائی اس کی قوپی میں آپ کو بناکے دے سکتا ہوں اس کتاب کو ہم نہیں دے سکتے کیوں نہیں دے سکتے وہ اس باستے کہ اگر آپ گھر لے گیا اور آپ نے اس میں pen سے لائنے لگانے شروع کر دیں تو پتہ چلے کہ جی دنیا میں ایک نُسخہ تھا جو سن 1902 میں لکھا تھا یہ 1850 میں لکھا گیا تھا اور اس میں now سن 2000 کے pen کی لائنے لگی ہوئی it damages the original we don't want to do that we try to make a copy but making a copy of a book بیٹھے رہو photo copier کے اوپر لگے بے other than the copyright issues دیر لگتی ہے افرٹ لگتی ہے and it's a lot of bother اور کرنا کیا ہے آپ نے لے جاکے اس کو بھی پڑھنا ہے اور پھر لاکے واپس دے دینا ہے anyway i'm trying to give you an example جہاں پہ آپ اس کتاب کو کرنا کچھ نہیں چاہتے ہیں you don't want to damage it you just want to read it but can I somehow take the original book put it inside a special polythene bag and give it to you in such a way کیا پڑھ بھی سکیں اور اس کو damage بھی نہ کر سکیں اس کے لیے we can think in terms of efficiency تو ہمیں مل گئی لیکن ابھی danger موجود ہے this is actually a call by reference کہ جی میں نے آپ کو reference ہی پکڑا دی ہے original کتاب ہی پکڑا دی ہے in a way and if you do something towards the original book library کی book damage ہو جائے گی can we somehow prevent that from happening and also have the efficiency of not having to make a copy coming back to the computer world suppose ہمارے پاس ایک data structure ہے اس کے اندر ایک string ہے لیکسے ایک ہزار characters لمبی ہے اور وہ data structure ہم function کو pass کرنا چاہتے ہیں اگر تو ہم اس کو کریں گے pass by value which is safe اس کو original structure کو کچھ نہیں ہوگا تو پہلے اس ہزار character کی string کو میں کہیں اور copy کروں گا which is normally on the stack پھر میں function کو call کروں گا وہ وہاں سے وہ copy ہزار characters کی اٹھائے گا اور پھر اس کو manipulate کرے گا اور جو کرنا ہے کر کے ہمارے ایک اٹھائے گا اپنی copy کو زیادہ کر دے گا call by value to be more efficient میں چاہتا ہوں کہ وہ ہزار character کی string یہانہ لکھی جائے صرف اس کا reference لکھ دیا جائے جو ابی تا خم pointers اور addresses کے ساتھ کرتے ہیں so address لکھ دیا function کو بھیر دیا اس نے address اٹھایا how do we prevent the side effects references کے ساتھ یہ سارے side effects ہو سکتے ہیں so be very careful whenever you can function calls and now we have to look at can we do something to prevent any changes the way we do it is by using the const keyword c o n s t const keyword جب آپ reference کے ساتھ لگا دیتے ہیں وہ کہتا ہے کہ ہی تو یہ reference do something لیکن اس کو آپ change نہیں کر سکتے so now we have an elegant mechanism ہم call by reference کی efficiency لے سکتے ہیں by stack کے اوپر بجائے وہ ہزار character کی string رکھنے کے یا پوری ایک کتاب کی copy بنا کے رکھنے کے ہم ایک اس کا address رکھتے ہیں which is the reference function میں جاتے ہیں تو function کہتا ہے مجھے کیا مل رہا ہے function کے prototype یہاں وہ کہہ رہا ہے const something it's saying you're getting a reference to a string or an integer or a double or whatever but it is a const you cannot change it ملا اس کو address اس نے آگے address کی manipulate کیا جو بھی کام کرنا تھا کیا لیکن inadvertently بھی اس کو وہ change نہیں کر سکتا original value کو so we've got now the best of both worlds we can have the efficiency of a call by reference and the safety of a call by value اس ساری چیز کو implement کرنے کے لیے we could have used the const with an address operator and a pointer but we can use a reference very elegant very simple کیونکہ function کے اندر references کو dereference کرنے کی کوئی ضرورت نہیں ہے کوئی star وگیرا نہیں لگتا ordinary variable names کے ساتھ وہ استعمال ہوتے ہیں چیلے آئیں ایک example دیکھتے ہیں کیونکہ ہم نے بہت کسم کی calls کی بات کی تو ان کو implement کیا جاتا ہے let's take a look at this simple example جہاں پہنے ایک structure جو کہ کافی بڑا ہے اس میں a character string a character array ایک ہزار character کی اور اب ہم اس کو call کرنا چاہتے ہیں اس کے ساتھ ایکی کسم کا function یعنی function ایک ہی ہوگا یعنی اس کا کام ایک ہی ہوگا لیکن ہم اس کو call تین مختلف طریقوں سے کرنا چاہتے ہیں ایک ہے call by value which is the default دوسرا ہے call by reference using pointers اور تیسا طریقہ ہے call by reference using a reference ویریابل سو what do we do we declare the prototypes of these functions پہلا ہم نے کہا دیا well function یہ اس کا نام ہے اور well function کو ہم value دیں گے اس structure کی تو structure کے ساتھ ہم نے اس کی argument just be اگر ہمارے structure کا نام ہے وہ دے دی دوسرہ جو ہے وہ ہے call by using pointers اب جب pointers کے ساتھ آپ function کی prototype لکھتے ہیں تو آپ لکھیں گے کہ جی pointer function اور پھر star b یعنی b is now a pointer to this structure structure کی type ساتھ آئے گی prototype کی اندر اور پھر تیسرا طریقہ وہ ہے calling by using a reference variable تو ہم کہتے ہیں ref function this is a reference function اور اس کے جو argument list اس میں وہی structure کا نام لیکن and b یہاں پہ دیکھیں یہ function کے prototype میں and b لکھا ہے اس کی call میں نہیں لکھا call اور چیز ہے call میں ابھی ہم آتے ہیں so simply جو function کی definitions ہے اب یہ 3 مختلف functions ہیں well function ptr function اور ref function ان کے اگر prototype دیکھیں تو تینوں میں فرق نظر آجاتا ہے پہلے میں صرف structure کا نام آگیا یعنی structure کا جو بھی type ہے وہ دے دی دوسرے میں structure کا pointer دیا اور تیسرے میں structure کا reference دیا اب آتے ہیں ہم main program کی طرف تو main program call کیسے کرتا ہے value کا تو simple ہے کہ جی well function اور آگے structure کا جو object ہے اس کا نام دے دیا وہ چلا گیا by value اور اس کا وہی طریقہ ہے جو میں نے بتایا تھا کہ جی stack پے وہ ساری value copy ہو جائے گی 1,000 characters کی function میں جائیں گے اس کے ساتھ جو بھی کرنے کریں function جو ہے کیونکہ call by value ہو رہا ہے وہاں پہاں اگر کوئی manipulation ہوگی تو original structure کو کچھ نہیں ہوگا اس کے بعد next call وہ call ہم نے کرنی ہے pointer function کو تو pointer function کو کیا چیز پاس کی جائے گی the address of the structure تو اس میں address operator and operator استعمال ہوگا اب دیکھیں یہاں پہاں تھوڑ سی confusing ہو جاتی ہے بات دیکھیں اب ہم بات کر رہے ہیں function call کی function call کیا اندر ہم کہیں گے ptr function اور پھر آگے and b اگر b ہمارے object کا نام ہے یعنی اس کا address ہم نے پاس کیا ہے efficiency صرف address stack پہ لکھا گیا function call ہوئی اس نے address اٹھاکے original values کو مل گئی اور تیسرہ جو ہے وہاں ہے reference function اس کی call جو ہے is now simple it looks like the call by value اس میں کوئی operator استعمال نہیں ہوگا ریف فنک b اسی واستے میں نے پہلے بتایا تھا کہ you cannot overload that یعنی reference function اور well function کی نام different ہونے لازمی ہیں they cannot be the same name because otherwise the calls look different and become ambiguous دوسرے دونوں جو alternative یعنی pointer call or reference call کیونکہ یہ reference بھیج رہی ہیں original structure کو they are dangerous if you want to prevent the function from changing that تو پھر آپ اس کو دیفائن کریں گے یعنی prototype میں آپ لکھتیں گے یہ a constant pointer آ رہا ہے یہ a constant reference آ رہا ہے then the function cannot modify the original value it can only read it so we get the efficiency of the call by reference but the safety of a call by value simple enough اس اجامپل کو آپ اچھی طرح سٹڑی کر لیں اس کو لکھیں اور چلایں and make sure that it works so what is the difference between references and pointers it's important to know in a way reference یہ بھی اس دوسی چیز یا ڈیٹا انٹریٹی کا ڈرس ہی رکھ رہا ہے but it's not really an address it's a synonym it's a different name for the entity reference جیسے ہی ہم اس کو ڈیکلیر کرتے ہیں اسی وقت اس کو initialize کرنا پڑھ جاتا ہے it has to point to something legal کوئی ڈیٹا طاپ کوئی ڈیٹا value exist کرتی ہو اس کا reference بنائے جا سکتا ہے آپ سمپلی اکیلہ کھڑا ہوا reference نہیں بنا سکتے a reference cannot be null that is a rule so immediately when you define a reference you have to declare it یہ رول functions پہ اپلائے نہیں ہوتا function کی جب argument list لکھ رہے ہیں آپ کہیں کہ جی مجھے اس function کے اندر مجھے ایک reference ملے ڈا reference you have a calling function نے پاس کر دینا ہے so here initialize نہیں کرنا لیکن اگر main program کے اندر آپ reference declare کرتے ہیں تو declaration کے ساتھ اس کو initialize کرنا پڑھ جاتا ہے reference ایک دفعہ initialize ہو گیا تو اس کو آپ reassign نہیں کر سکتے so for example ہمارے پاس let's say ref i is a reference to an integer ہم program کے اندر declare کرتے ہیں int and ref i equals j where j is an integer that we have already declared so we have declared a reference and initialized it automatically immediately suppose we had another integer called k program میں چلکے آپ نہیں کہہ سکتے کہ ref i is equal to k once it's defined it's now will always refer to the same integer location as j so memory میں ایک ہی جگے کو point کر رہا ہوگا you can prove the integer variable and the address of the reference that it points to do it it would be rather interesting یہ اگزامپل لیلیں اوپر انٹ i or پیر لکے انٹ ref i equal to انٹ and ref i equal to i so you've declared an integer and you've declared a reference to an integer and initialized it to point to the same place as i using c out how do you get the address you use the address of operator which means the and sign so we say c out less than less than the address of the reference is within quotes پھر stream insertion operator استعمال کر لیں اور آگے and ref i so and ref i کہ جی اس reference کا address پتاو وہ دیکھیں گے کوئی hexadecimal number screen پیو پر دکھائے گا ساتی next and کو پرنٹ کرنے see what happens are they the same value are they different values think about it I won't give you the answer do it yourself and find out and then think about it from a logical perspective does it make sense ایک ہم نے reference you has a another name for a variable so do they have the same address going on from there normally میں ایک reference variable create کروں to point to another data another data member or data variable جو کہ exist کرتا ہو because creating synonyms which means two names for the same thing in a way is confusing you won't want to use that in your program کہ ہے وہ یہی ہے جو میں نے ابھی functions کے example کے ساتھ بتایا کہ جی call by reference کو ایک nice elegant or clean interface کے through implement کرنا so you can use the reference variables جو ہیں وہ function calls کے اندر زیادہ استعمال ہوتے ہیں what else can we do with reference variables well a function itself اس کی declaration line کیا ہوگی suppose ہمارے پاس ایک function ہے اور وہ ایک integer کا reference واپس بھیجتا ہے so اس کی declaration would become int and function name اور پھر آگے parenthesis کے اندر اس کی parameter list that means the function returns a reference to an integer کیا جا سکتا ہے لیکن اس کے اندر بھی جو آپ کو reference کی definition تو پتا چل گئی کہ جی ایک point to some memory location is like a pointer but more restricted جیسے ہی declare ہوتا ہے اس کی value assign ہوجاتی ہے جب function کے اندر آپ return کریں گے value تو وہ value will be a reference to some memory location وہ memory location اگر تو اور x کو return کر دیا when the function returns x dies x مر جاتا ہے it doesn't exist outside the function but what we've done is اس مرے وے variable کا reference ہم نے calling program کو بھیج دیا in other words the calling program now has a reference variable that points to nowhere because the جس چیز کا reference ہم نے بھی جاتا وہ چیز تو exist کرتی ہی نہیں ہے this is called a dangling reference so be careful when you use something like a function returning a reference کب استمال کیا جا سکتا ہے وہ ہے کہ جی اگر آپ کے پاس کوئی global variable ہو تو global variable کا reference وہ function واپس بھیجے گا تو وہ global variable تو exist کرتا ہے for the life of the program یا کوئی static variable ہو static variables بھی جو ہیں وہ پہلی دفعہ کریٹ ہو جاتے ہیں اور پھر they exist for the life of the program they don't die اُن کا reference واپس بھیجنہ is alright but do not return a reference to a local variable otherwise you will have a dangling reference some compilers will catch it most will not کیوں کہ جو function ہے جو return کرے reference وہ علیدہ سے define ہو رہا ہے اس کو نہیں پتا چلتا کہ یہ global ہے local ہے کیس چیز کا ہے because you could do many manipulations in that function because we'll catch this type of error you have to be careful let us take a look at an example of a function returning a reference تا کہ آپ کو تھوڑ سی بات clear ہو جائے ہم پہلے ایک declare کرتے ہیں global variable an integer called myNum and we say it is zero اس کے بعد ہم declare کر رہے ہیں a function that returns that's it یعنی اس نے جو global variable تھا اس کو واپس کر دیا اور واپس کیا in the form of a reference so it is now the function call جب ہوگی the return of the function call will be a reference to this global variable called myNum now we can write a main function جہاں پہ کچھ بڑی interesting چیز ہم کرنے لگے I can write something like myNum equal to 100 global variable تھا یہاں پہ available ہے اس کو value 100 assign ہو گئی اگر میں کہوں کہ جی int i equal to my function اس کا نام ہے num so int i equal to num with parentheses تو what happens is a reference to myNum is returned I would want کہ جی reference کو reference کے ساتھ assign کریں but you can use it as an ordinary variable ایک ہم ایک ویلو assign ہو جاتی ہے now look at the next line which is very interesting I say num parentheses which is a call to that function returning a reference to an integer so num parentheses equals 200 semi colon wow are we are we breaking some rules over here right at the start of all of our lectures I said کہ جی the left hand side of an assignment operator can only be a simple what we call an L value a left hand side value صرف ایک ویریبل کا نام سیمپل کسم کا ہو سکتا ہے کوئی expression نہیں ہو سکتی کوئی function call نہیں ہو سکتی لیکن یہاں پہ function call is on the left hand side of the assignment operator is that valid in this case it is valid because this function called is returning a reference to a global variable if it returns a reference it means it's a synonym it's like writing myNum equals 200 یہ صرف میں نے ایک سامپل آپ کو دکھائے کہ یہ بھی کیا جا سکتا ہے but as you will agree totally confusing and a bad idea یہ کام نہ کریں پہلے میں نے کہا تھا کہ جی simple reference variables بھی استعمال کرنا unless you have a real need for the same data don't do it same thing over here you can put a reference returning function on the left hand side of an assignment statement but it's confusing and a bad idea don't do it where are references useful they are useful in implementing a call by reference in an efficient fashion and writing the function very elegantly without using any processing operators restrictions pointers or references کے اندر کیا فرق رہا جاتا ہے کہ وہ بھی ایک pointer ہے address رکھا ہے reference یہ بھی refer کر رہا ہے کسی چیز کو pointer کے ساتھ آپ ہر کسم کی arithmetic کر لیتے ہیں اس کو increment کر لیتے ہیں اس کو decrement کر لیتے ہیں اس کو reassign کر لیتے ہیں ایک integer pointer پہلے کسی integer کو point کر رہا ہوتا ہے references یہ کام نہیں کر سکتے آپ reference کو increment نہیں کر سکتے آپ references کو اپس میں compare references کو وہ نہیں کرتے آپ references کو reassign نہیں کر سکتے so major usage is in implementing a call by reference اب تھوڑا سا آگے کا میں preview دے دوں کہ references نے پھر آنا ہے ہمارے پاس اور کافی زور شور سے آنا ہے اگرہا ہے پہلے تھوڑی سی confusing جو باتیں ان کو ہم clear کرتے چلیں and sign ہم نے استعمال کیا ہے for declaring a reference how do you know simply code کو پڑھتے بے how do you find out کہ یہ reference کی بات ہو رہی ہے یا address لیا جا رہا ہے simple rule اگر declaration لین کے اندر reference کا symbol یعنی and symbol نظر آئے so that is the declaration of a reference so you will say int and reference so you will say int and i double and f char and c and things like that these are declarations left side پھر آپ کو data type نظر آئے data type کے بعد آپ کو reference کا symbol which is the ampersand وہ نظر آیا اور پھر reference کا نام which is the variable name وہ نظر آئے گا جب بھی آپ کے پاس code میں simply and i لکھا ہو یعنی آگے int, double وگیرا نہیں لکھا ہوا that means اب آپ لیے رہے ہیں so it's a simple rule when you have a data type followed by an ampersand sign وہ reference ہے جب آپ کے پاس ampersand sign code کے اندر استعمال ہو رہا ہے with a name of a variable تو یہ اس کا address لیا جا رہا ہے so it's an easy way of differentiating the two now let's go to the preview دیکھیں c میں بھی or c++ کے اندر ہم کافی چیزیں استعمال کرتے ہیں ہم کہتے ہیں a is equal to b is equal to c سیمی کولن how does that whole statement work we know کہ ہوگا کیا جو c کی value تھی وہ b کو ایسائن ہو جائے گی اور پھر وہی value جو ہے وہ a کو ایسائن ہو جائے گی do we understand how this works how this works is as follows c and in c++ ہر statement جو ہے every statement it in itself returns a value تھوڑسا ہی اس بات کو سوچ لے statement بھی now value return کر رہی ہے یہ نہیں statement بزات ہے خود کی value ہے وہ value کیا ہے normally the value is that of the value of the left-hand side so when we write a is equal to b b کی value a کو ایسائن ہو جاتی ہے اور a کی جو value ہے that becomes the value of the entire statement تھوڑسا ہی اسائن ہو جائے گی therefore when we write a is equal to b is equal to c تو پہلے b is equal to c execute ہوتا ہے c کی value b میں آجاتی ہے since this was in itself a statement statement کو b کی value مل جاتی ہے so a equal to جو ہے اس کو کیا چیز نظر آتی ہے statement کی value which happened to be b so a equal to b also works اب یہاں تک I hope you understand that every assignment or every statement carries a value and that allows us to write chained assignments like this اسی طریقے سے اگر a plus b plus c کو آپ سوچنے لگیں تو وہ بھی یہی ہو رہا ہے کہ c کی value b میں add ہوئی وہ value return ہوئی اور a plus جو ہے وہ return value جمہ ہو گے what happens اور یہ آپ چیز استعمال کرتے آئے ہیں اس کو سوچنے کی باری آگئی what happens when we write something like c out less than less than quotation marks کے اندر the value of the integer is پھر less than less than I less than less than and L end of line semicolon کیا ہو رہا ہے یہاں پہ what we've got is extreme right والی جو چیز ہے وہ execute ہو رہی ہے پھر next ہو رہی ہے پھر next ہو رہی ہے یا the other way c out چال رہا ہے well we know نظر کیا آئے گا screen کیا پر پہلے آئے گا the value of the integer is پھر آئے کی value آئے گی پھر new line آئے گی so it is moving from left to right لیکن c out کو جب پہلا حصہ ملا which is the string saying the value of the integer is تو یہ ایک c کی statement ہے یہ جب execute ہوتی ہے تو this is the value تو screen پہ آگیا لیکن اس کی value کیا بنے گی اس کی جو بھی value بنے گی has to work with the following less than less than I sign جو بھی less than less than اس کے بعد آ رہے اس کے ساتھ اس value نے کام کرنا ہے اور یہ جو double less than sign ہے اس کے ساتھ کیا چیز کام کرتی ہے ابھی تاک ہمیں یہ پتا چلا کہ وہاں پے c out ہونا چاہی ہے so actually what happens is کہ when the first part of the statement executes when it becomes c out double less than the value of the integer is یہ جب execute ہوتی ہے تو c out return ہوتا ہے اور c out return ہونے کے بعد اس کو پھر کیا نظر آتا ہے double less than I I کی value screen پرنٹ ہو جاتی ہے پھر کیا return ہوتا ہے c out return ہوتا ہے اور پھر double less than کے بعد end L آرہے تو end line execute ہو جاتی ہے اور پوری سٹیٹمنٹ جو ہے اس کی return value پھر بھی c out ہی رہتی ہے this in fact c out is a stream it doesn't have a value پر سے what is being returned is a reference to this stream اور وہ reference یہی ہے جن references کی ہم نے آج بات کی یہی چیز apply کرے گی to operators like plus minus multiply this will also apply to equal to any assignment operator the equal sign and so on وہاں پہ ہمیں reference variables کا بہت سارہ استعمال کرنا پڑے گا so what have we learnt today آج ہم نے ایک نئی کسن کی دیتا تائپ کی بات کی وہ ہے reference دیتا تائپ ہم نے کہا reference دیتا تائپ that is a synonym or an alias for another type of data انٹیجر کا synonym لے لیں یہی نہیں it's a second name for another variable اس کے بعد میں نے آپ کو کچھ do's and don'ts کا بتایا اور یہ کہا کہ جی normally we do not want to use two names for the same variable it's a bad idea it leads to confusing programming but then we found the most useful part of using a reference کہ اگر call by reference implement کرنا ہو function کے ساتھ تو using a prototype of the function which says جو جے references مل رہے ہیں leads to very clean programming you use the names of the variables without having to use any dereferencing operators like star so the most useful part is implementing a call by reference then we went on and we looked at a slight difference between pointers and reference variables and I would suggest اس کو بھی آپ اچھی طرح پڑھ لیں کہ reference variables کو increment نہیں کیا جا سکتا ساتھ ارثمیٹک نہیں کیا جا سکتی but most importantly reference variables must be initialized when they are declared this is important pointers جو ہے you have pointer declare کر کے جب مزیو اس کو value assign کر لیں ایک جگہ پہ اس کا ایک quirk آتا ہے کہ class ہم class is on objects I hope آپ بھول نہیں گئے آج کے لیکچر میں وہاں پہ اگر reference declare کریں تو پھر کیا ہوگا that we will cover later اس کے بعد میں آپ کو تھوڑا سا ایک preview دے دیا کہ references کا استعمال کہاں پہ آئے گا اور اس preview دینے کے اندر میں نے آپ کو کچھ نئی چیزیں جو ہیں وہ بتائیں ہیں وہ ہے کہ ہر سٹیٹمنٹ وہ بزاتے خود ایک value رکھتی ہے اور وہ value return ہوتی ہے استعمال کریں یا نہ کریں is a different issue یعنی if we call a function on a single line we say f parenthesis semicolon تو maybe f returned a value ہم نے استعمال نے کیا not a problem اسی طریقہ سے if we say a is equal to b semicolon تو this statement itself has a value whether we use it or not is a different issue اور اس argument کو لے کہ میں آگے چلا اور see out کی مدد سے آپ کو بتایا کہ جناب see out کے ساتھ جب ہم کوچیز پرنٹ کرتے ہیں اور ایک دو تین مختلف چیزیں پرنٹ کر رہے ہوتے ہیں تو ہر execution of see out actually returns a value that value happens to be a reference to see out itself it becomes a reference to this stream اور یہ references کیسے define ہوں گے کیسے declare ہوں گے یہ ہم آندھا لیکچوز میں cover کریں گے جب ہم operator overloading کے اوپر بات کریں گے تو references revisit ہوں گے اور it's a very important topic for the moment I would suggest کہ آپ کچھ programs لکھیں اور pointers کی جگہ پے references کی مدد سے آپ call by reference implement کر کے دیکھیں so till next time خدا حافظ