 اسلام علیکم پسٹی دفعہ ہم نے ایک نیا طوپک انتروڈیوز کیا تھا اور اس پر دسکاشن چھوڑے کی تھی وہ تھا پوائنٹرز سی اور سی پلس پلس کی جب بھی بات ہوتی ہے تو کوئی بھی نولجابل بندہ کہتے ہیں آہ پوائنٹرز پوائنٹرز پوائنٹرز اور مورٹ پوائنٹرز well طوپک جہا ہے وہ تھوڑا سو کomplicated ہے لیکن اتنا زیادہ نہیں لیکن پوائنٹرز کے ساتھ ہمیں جو پرگریمنگ کے اوپر پاور ملتی ہے وہ بڑی انٹرسٹنگ ہے اور ہم بڑی بڑی مزے کی چیزیں کر سکتے ہیں اس کے ساتھ آگے چل کے جب نئی لنگوڈیز آئیں ہیں جاوہب اگرہ تو اس کے اندر انہوں نے explicitly پوائنٹرز کو exclude کیا ہے لیکن اس میں بھی پوائنٹرز کے قریبی رشتہ دار موجود ہیں and we will see how that comes into being you will learn those in subsequent courses for the moment ہم درہا پوائنٹرز کی دسکرشن کو آگے بڑھاتے ہیں اور دیکھتے ہیں کہ جی پوائنٹرز اور ایریز کی کیا relationship ہوتی ہے پوائنٹر expressions کیا ہوتے ہیں پوائنٹرز کے ساتھ ہم arithmetic کر سکتے ہیں اور پھر multidimensional arrays کی اوپر بھی بات کریں گے پر خاص طور پہ پوائنٹرز strings اور arrays کی اوپر بات ہوگی let's take a look at what is the relationship between pointers and arrays if you think about it لیکن ہم جب کہتے ہیں انٹ x تو ہم کیا بات کر رہے ہیں ہم کہہ رہے ہیں کہ یہ ایک memory location ہے اس کے اوپر ہم نے ایک سیمبالک name attach کر دیے x so we can use x equal to 10 اور وہ memory location میں جاکے دس کی value place کر دیتا ہے لیکن جب ہم arrays کی بات کرتے ہیں سپورس ہم ایک declare کرتے ہیں انٹیجر array ہم کہتے ہیں انٹ y square bracket 10 اس کا مطلب ہے ہم نے memory میں 10 انٹیجرز کی ایک array declare کر دی سو دس انٹیجرز کے لیے memory location reserve ہو گئی اور collectively اس کو ایک ہم نے name دیا y so پہلے تو ہم نے ایک location کو name دیا تھا x کی جب ہم بات کر رہے تھے simple integer کی جب ہم array کی بات کر رہے ہیں تو ہم نے ایک collectively location of the same data type in this example integer اس کو ایک نام دیا y تو y بزاتے خود کیا چیز ہے is it just the name or is it something more than a name I've probably already mentioned it in earlier lectures why represents the address of the beginning of this memory space جو دس انٹیجرز کی جگہ جو reserve ہوئی ہے اس کی جو شروع والی جگہ ہے it means y of 0 ہم لکتے ہیں یاد ہوگا آپ کو y square bracket 0 that is the first element یعنی پہلہ انٹیجر جو ہے تو پہلے انٹیجر کا جو memory address ہے وہ y میں موجود ہوتا ہے so that means in a way the name of the array is like a pointer which contains the address of the first element but how is it different from an ordinary pointer دیفرنس یہ ہے کہ جی جو ایرے کا نام ہے وہ address تو ضرور کونٹین کرتا ہے لیکن it's a constant pointer constant pointer کا مطلب یہ ہے کہ وہ کہیں اور point نہیں کر سکتا وہ ہمیشہ اسی ایرے کے beginning address پے point کرتا رہے گا otherwise it is very similar for example ہم ایک array ڈیکلیر کر لیتے ہیں یہی سمجھ لیں y of 10 ہے انٹ کی ہے اور ایک point ڈیکلیر کر لیتے ہیں let's call it yptr so we say int star yptr اور آپ کو یاد ہوگا اس کو پڑھنے کا طریقہ یہ ہے کہ yptr is a pointer to integer so right to left پڑھیں گے کبھی confusion نہیں ہوئے گی so what we saying is ہمار پاس ایک array آگی ایک pointer آگیا اب یہ pointer جو ہے remember it can contain a memory address and the memory address should point to something like an integer in this case we can use a very simple assignment statement if we write a line saying yptr equals y that's it simple ڈیکلیر کر لیتے ہیں of course ڈیکلیر کر لیتے رہے گے اس کا مطلب یہ ہے کہ جو y کی value تھی اور y کی value کیا تھی y was the address of the first element of the array وہ جو ہے وہ yptr کے اندر آ جائے گی so now you have two things pointing to the same location ایک تو ہے ایک اپنا نام which was y اور دوسرا ہے yptr which is also pointing to the same thing ڈیکلیر کر لیتے ہیں لیکن میں پہلے بھی از کیا تھا کہ why جو ہے وہ it's like a constant pointer ایک دفعہ آپ نے an array ڈیکلیر کر دی وہ memory میں اسی جگہ کو point کرتا رہے گا نام جو ہے اس کا ہمیشہ لیکن جو yptr ہے it is a pointer variable which means ابھی وہ اس ایرے کے beginning پر point کر رہا ہے اس دوسی وقت وہ اس کسی اور address کو point کر رہا ہے ایسی پرا so it's a variable ڈیکلیر جو ہے وہ دونوں کی برابر ہے آپ اگر آپ کہیں y of 3 so that means it's the fourth element of the array remember zero based indexing ہو رہی ہے c کی arrays کے اندر اگر ہم yptr کو استعمال کر کے ہم fourth element لینا چاہیں تو ہمارے پاس کئی طریقے ہیں you can actually say کہ جی مجھے yptr plus 3 دے دو یا plus 4 دے دو so وہ آگے والے element تک address جلا جائے گا how does it do that we have to look at it ڈی what happens when we increment a pointer or we add something to a pointer دیکھیں let's go on and think about the increment operators plus plus minus minus decrement operator ہے ہمارے پاس اسی example کو لیکے آگے چلتے ہیں y جو ہے ہم نے کہا وہ array کا نام ہے and it's like a constant pointer اگر وہ constant pointer ہے تو y plus plus نہیں لکھا جا سکتا you cannot increment the name of the array you can always say y of 0 y of 1 y of 2 that's no problem but you cannot say y plus plus and think کہ y تو y of 0 کو point کر رہا تھا لہذا y plus plus وہ y of 1 کو point کرے گا doesn't work y is a constant pointer so you cannot increment it on the other hand yptr is a pointer variable so if we first said yptr is equal to y تو y pointer کیاندر ہم نے y array کا starting address رکھتیہ اب اس کے بعد جب ہم کہتے ہیں کہ جی yptr plus plus تو کیا ہوگا be لازمی بات ہے کہ yptr کی value تو increment ہوگی the interesting question is کتنے سے increment ہوگی normal integer variable جیسے x تھا ہمارے پہلے اگر ہم کہتے ہیں x plus plus اور x کی value 10 تھی تو اس کی value تو 11 ہو جاتی تھی اب ہم بات کر رہے ہیں pointer and pointer to an integer کی تو اگر yptr کو plus plus کریں تو کیا اس کی value ایک سے زیادہ ہوگی نہیں memory address will be incremented by 1 اور memory address will be incremented by some other amount what do you think interestingly enough what happens is that the data type that the pointer points to determines کہ pointer کا increment جو ہے وہ کتناہ آگے جائے گا in this case yptr is a pointer to an integer لہذا جب yptr کو ہم increment کرتے ہیں it points to the next integer this is an important point یعنی اگر انٹیجر ہماری مشینوں پے 4 bytes جگہ لیتا ہے تو it will go to the fourth 4 bytes along away from where it was یعنی increment جو ہے اس کا 4 bytes at a time اس کو دیکھنے کے لیے آپ چھوٹا سا program لکھ سکتے ہیں very simple یہی کرنے آپ کہ جی ایک array ڈیکلیر کر لیں ایک pointer ڈیکلیر کر لیں let's say they are integers اور yptr میں assign کرنے y کا address اور پھر see out کے ساتھ yptr کو print کریں which is the pointer تو see out you have a pointer کی value دکھائے گا which means it will show the memory address which is contained in yptr at that time اس کے بعد آپ کریں yptr plus plus اور پھر see out سے کہیں کہ yptr کی value پرنت کریں what you will notice is کہ جی ایک number اجیب سا بدل گیا ہے introduction to computing میں آپ نے تھوڑی سی hexadecimal arithmetic پڑی ہوگی by default جو pointer جو values ڈکھتے ہیں which is addresses memory addresses are printed in hexadecimal by your see output system as a result جو yptr کی value آپ کو screen پر نظر آئے گی وہ hex میں لکھی ہوگی so آپ دیکھیں گے کہ جی hex کی numbers بدل گئے ہیں for example اگر پہلہ number five zero تھا کوئی بھی اس کی let's say last two digits تو اس کے اندر چار کا increment کر کے وہ آپ کو answer دکھا رہا ہوگا why because yptr is a pointer to an integer so when you increment a pointer it actually jumps the number of memory spaces according to the data type that it points to it's very interesting اب اسی کو لیکے اگر چلیں کہ اگر yptr کو increment کرنے سے وہ next integer کو point کرتا ہے اور ہم نے شروع کیا تھا کہ yptr میں ڈکھے پہلے element کا address پڑا ہوئے تو increment کرنے سے کیا ہوا yptr now points to the second element of the array which is y of one increment it again it'll point to y of two increment it again it'll point to y of three and so on what happens if we increment it too much any array جو ہے وہ تو دس نمبروں کی ہے ہم نے دس کی بجا اس کو بارہ دفعہ increment کر دیا will there be a problem well you think about it will come to it in a minute for the moment دیکھیں ہم اگر کر سکتے ہیں کہ جی yptr is equal to y so we can also think about saying yptr is equal to and y of zero remember ampersand جو ہے and جس کو کہتے ہیں that is the address operator so we can take the address of the first element so yptr equal to y is exactly equivalent to yptr equals and y square bracket zero square bracket so it is the same thing assigning the address کیونکہ y of zero is a single element اسی طرح y of one is an element y of two is an element تو ان کے integers کے addresses لیے جا سکتے ہیں so you could easily say yptr is equal to and y of two which means the y of two کا address yptr کی اندر آ جائے گا so you can think in terms of کیدی اس سے ہمیں کیا منیpulation کی power ملتی ہے you can randomly point to any element in the array اس کا addresses لے لیں اس کے ساتھ جو مرزی کرنا ہے وہ کریں now let's talk about that increment thing again دیکھیں اگر ہم نے yptr کو increment کیا جب ہم array کو point کر رہے تھے تو اس نے next array element کو point کرنا شروع کر دیا so we can always print it by saying let's say see out less than less than star yptr اور وہ جس array element کو point کر رہا ہوگا اس کی value print ہو جائے گی میں نے کہا تھا کہ جی what happens if we incremented too much well let's start with a simple example suppose we say x is a simple integer variable so int x and let's say yptr ہمارے پاس وہی ہے pointer to an integer پر ہم کہ دیتے ہیں yptr is equal to and x x کی value address وہ yptr میں store کر دیا اب آپ یہ actually لکھیں اپنے لیے programs لکھیں experiment کریں اور دیکھیں کیا ہوتا ہے آپ print کریں yptr کو you will see that hexadecimal representation of the memory address which is the address of x پھر آپ print کریں star yptr کو that means the value pointed to by that address so the value placed at the address جو کہ yptr میں پڑھا بے توگر x کی value پہلے 10 تھی تو آپ کو 10 output میں نظرانا چاہیے if you print the value of star yptr اب آپ کریں star yptr plus plus یہ کیا کرے گا as written کوئی parentheses نہیں کوئی کچھ نہیں کہہا star yptr plus plus اس کو اگر پڑھنے تو پڑھنے کا طریقہ یہ ہے increment whatever yptr points 2 so interestingly x جو ہے وہ 10 سے 11 ہو جائے گا you have incremented the value of x by 1 اور اس کو بھی پرنٹ کر کے دیکھیں so write your little program that plays with all these combinations what happens if we let's say add star yptr plus 3 جب آپ کہتے ہیں star yptr plus 3 تو یہ ایک expression ہے اس نے جو original variable تھا x اس کو کچھ نہیں کیا اس کی value میں 3 جمع کر دیا so you can use it on the right hand side you can print the value you will notice کیاگر x10 تھا تو 13 پرنٹ ہوگا that is all right but when you increment star yptr then you are incrementing the variable itself so if you said something like star yptr plus equals 3 now it says in longhand کہ جی whatever yptr points 2 اس کو 3 سے increment کر دو then x if it was 10 it would go to 13 what happens if we try to increment the pointer itself so now we are not incrementing the star yptr we want to incrementing the yptr میں نے already آپ کو explain کیا کہ جب آپ ایک pointer variable کو increment کرتے ہیں تو اس کے memory address increments by the number of bytes determined by the type of data that it points to in this case if you say yptr plus plus it will increment yptr by 4 bytes if our machine has an integer representation which takes 4 bytes the question is کہ جی اگر yptr was pointing to this simple integer variable x اس کو increment کرنے کے بعد وہ کہاں point کرے گا this is exactly the same as جو میں نے پہلے question pose کیا تھا کہ جی ڈی 10 نمبروں کی ہے اور ایک pointer variable لے کے آپ نے ڈی میں point کرا دیا اور پھر اس کو increment کرنے لگے اور 10 کی بجائے 12 دفعہ increment کر دیا تو کیا وہ increment ہو سکتا ہے the answer is yes there is no problem with incrementing the pointer the problem lies کہ جی اب وہ point کیس چیز کو کر رہا ہے دیکھیں جب بھی آپ اپنا program لکھتے ہیں اس کے اندر کچھ variables کچھ arrays کچھ چیزیں declare کرتے ہیں ان چیزوں کے لیے ان variables کے لیے اور arrays کے لیے memory میں خاص جگہ جو ہے وہ reserve ہو جاتی ہے اور وہ جگہ جو ہے label ہو گئیں pointers ایک ایسی چیز ہے جو کہ memory میں کہیں بھی بھی point کر سکتے ہیں جب آپ pointer کو increment کرتے ہیں اور وہ کسی ایسی جگے پہ point کرتا ہے جو کہ آپ کے program کا حصہ نہیں ہے which means yptr is equal to and x ٹیک ہے x was part of the program اس کا addresses part of the program اس کی value yptr کی اندر آگئے آپ اپنے کہا yptr plus plus suppose there is no other integer variable yptr will now point 4 bytes away from the original address of x what that means is it is now pointing to a memory area which was not part of your original program so what does it point to again my suggestion is can you write your program and you see پہلے تو yptr کی value print کریں وہ تو آپ کو نظر آجے گی جی وہ چار memory addresses آگے جا چکا ہے then try to print star yptr which means what is the value at this location it will probably be garbage we don't know ہم نے تو initialize نہیں کی ہم نے تو اپنے program میں استمالی نہیں کی ہوئی so we really do not know کہ وہاں پہ کیا ہے کوئی random value آپ کے لیے print ہو جائے گی interesting thing is کہیں پہ کوئی illegal چیز ہوئی نہیں ہے یعنی نا کمپائلر نے آپ کو روکا کہ جناب یہ کرنا کوئی illegal کام ہوگا اور نا ہی program چلتے بے اس نے آپ کو روکا کہ یہ کوئی illegal کام ہوگا ہاں illegal کام ہو ضرور سکتا ہے کہ اگر آپ اس location پہ کچھ لکھنے کی کوشش کر دیں if you try to write into this memory location which was not part of your program then you might come up with some very strange results modern operating systems جو ہیں وہ تو اس چیز کے against protected ہیں کہ جی اگر آپ memory modify کرتے ہیں تو program کی اپنی space میں memory modify ہوتی ہے لیکن کئی دفعہ آپ اسی pointer کے through پورے computer کو crash بھی کر سکتے ہیں دھوہ نکالنےگر نکالنے ہیں so it is a dangerous tool but so you have to be careful کہ جی pointers کا استمال کیسے کیا جائے remember when you are using a pointer to hold the memory address of a simple variable when you shouldn't be incrementing or decrementing pointers when you're working with pointers and arrays then it makes sense کہ جی اس کو increment کریں تو اگلے array element پہ چلے گے decrement کریں تو پہلے array element پہ آگے and so on so you can use it to manipulate but for the moment just remember کہ کوئی آپ کو warning نہیں ملے گی جیناب یہ کوئی آپ خلط کام کرنے لگیا if you increment a simple address کو آپ نے increment کر دیا پہلے تو آپ یہ دیکھ لیں کہ جی make it very clear that you know what happens when you increment the pointer and what happens when you increment what the pointer points to be clear with that notation یعنی اگر آپ pointer کو increment کرنا چاہتے ہیں تو make sure کہ آپ پر انتسیز کا استعمال کریں فر اگر ہم یہی yptr مشہورے زبانہ اس کو لے کے آگے چلتے ہیں کہ دی اس میں ایک integer variable کا ڈرس پڑاو ہے x کا ڈرس پڑاو ہے x کی value 10 ہے اگر آپ کہتے ہیں star yptr plus equals 3 تو x کی value increment ہو جائے گی لیکن اگر آپ کہتے ہیں yptr plus equal to 3 تو pointer کی value increment ہو جائے گی تو play with this and make sure you know what you are incrementing یا بھی چل کے آگے پھر ڈرس میں اس کو visit کریں گے ڈیکریمنٹنگ is no different you can always subtract things from a pointer you can subtract things of course from whatever the pointer points to if it makes sense and you don't want to subtract things from a character variable but from an integer or a float you can subtract جو چیزیں یاد رکھنے والی ہیں وہ جی ہے پہلی چیز کہ جی pointa جو ہے وہ کسی ڈیٹا تیپ کے ساتھ ڈیٹ ہے so you have a pointer to an integer a pointer to a float a pointer to a character then when you increment or decrement the pointer جی نیوز کی value بڑھائیں یا گھٹائیں it changes the address in there by the number of bytes occupied by the data type that the pointer points to put it more simply اگر وہ pointer to an integer ہے تو اس کو increment کریں گے تو وہ چار بیٹ سے بڑھ جائے گا اگر ہماری مشین پر integer چار بیٹ میں store ہوتا ہے اگر float کا pointa ہے اور float 8 bytes میں store ہوتا ہے تو incrementing a pointer to a float means incrementing the memory address by 8 bytes character تیپکلی 1 byte میں store ہوتا ہے تو اس کو increment کرنے سے 1 byte change ہوگا pointer کی value so these things you should remember always whenever in doubt whenever you come across a new machine architecture آج آپ پیسی پے کام کر رہے ہیں کال شہد آپ کسی اور macintosh پے کام کر رہے ہیں یا main frame پے چلے جائیں write your little 2-3 bits of lines of code and try to figure out کیس پے انٹجر کتنا store ہو رہا ہے کتنی bytes لے رہا ہے float کتنی bytes لے رہا ہے and the simplest way of doing it is use this pointer arithmetic اگر آپ کے پاس modern operating system ہے جسے windows 2000 ہے یا windows xp ہے تو اس کے اندر ایک accessory کے اندر tool آتا ہے calculator calculator آپ استعمال کر سکتے ہیں اور اس کے اندر اگر آپ دیکھیں تو view کے اندر ایک ہے standard اور ایک ہے scientific view یا آپ کے پاس اگر اپنا calculator ہو اس میں بھی دیکھیں کہ hexadecimal arithmetic وہ کرتا ہے کہ نہیں جو آپ کے windows کے ساتھ calculator آتا ہے اس میں hex view میں چلے جائیں تو you can do hexadecimal arithmetic تو جو آپ کو memory addresses آپ پرنٹ کرا رہے ہیں اپنے c programs میں سے آپ اس میں key in کر دیں اور وہاں سے add subtract کر دیکھیں یہ abc کیسے add ہوتے ہیں اور اس cancer کیا تھے اور کیا وہ telly کرتا ہے آپ کے program کے ساتھ یا نہیں so play with this always experiment always find out for yourself do not believe something جو کے کتاب میں لکھی ہوئی ہے do not take it as the gospel truth جو میں نے یہاں پے کہ دیا ہے find out for yourself be inquisitive be experimentative ہم نے یہ دیکھا کہ جی point us کو increment بھی کر سکتے ہیں and decrement بھی کر سکتے ہیں کیا point us کو ہم اپس میں add کر سکتے ہیں again since i am going to tell you the answer i wish i didn't have to and you should have found it out for yourself لیکن what happens is suppose you had two pointers to integers you had int star p1 comma star p2 اور نیچے چلکے آپ اگر کہیں کہ جی p1 plus p2 کہیں پے تو compiler ہی normally آپ کو warning دے دے گا or syntax error دے دے گا کہہ گا کہ جی مجھے دو point us کو add کرنا نہیں آتا خودی سوچیں کہ ہم کر کہ رہے ہیں ہم کہہ رہے ہیں دو memory addresses کو جمع کرو how do we know that the answer is going to be valid 2 plus 8 is 10 it may be way out of the range جنی جہاں پہ آپ کی memory ختم ہو جاتی ہے وہاں سے بہر کی کوئی value بن رہی ہو so normally the compiler will not allow you to add two pointers together can you subtract pointers from one another that is interesting subtraction is relatively easier کیونکہ دیکھیں ہو کہا رہا ہے ہم کہیں کہ جی اگر دو pointers ہیں ان میں ایک ہی value پڑی ہوئی ہے تو اس کو subtract کریں گے تو answer 0 آئے گا کچھ سمجھاتی ہے بات کی اگر دو pointers ہیں ایک let's say array کے پہلے element کو point کر رہا ہے اور دوسرا array کے دوسرے element کو point کر رہا ہے and suppose the array is of type integer تو ان کو subtract کریں تو پھر آپ کے پاس 4 bytes کا فرق آنا چاہئے whatever but try it out take an array let's say y of 10 کوئی values assign کر دیں دو pointer لے لیں y1 y2 ان کو کوئی addresses assign کر دیں array میں سے let's say y1 is equal to and y of 0 which is the same as y1 is equal to y and take the second one say y2 is equal to and y of 3 so it now points to the fourth element of the array then using see out print y2 minus y1 پہلی چیز you will not get a compiler error number 2 you will be surprised by the result what do you think the result will be I already mentioned جب ہم increment کرتے ہیں pointer کو تو وہ increment ہوتا ہے by the number of bytes occupied by the data type تو جب ہم دو pointers کو subtract کریں اپس میں تو کیا وہ number of bytes میں جواب دے گا in this case 0 or 3rd element یا y of 3 کے اندر فرق تو 3 numberوں کا ہے 3 integers کا ہے اگر integer 4 bytes occupy کر رہا ہے تو کیا difference between these 2 pointers ہمیں 12 آئے گا well do it and find out and prove to yourself 12 نہیں آئے گا وہ difference آپ کو 3 دکھائے گا which is very interesting پہلے پہلے پہلے پہلے پہلے پہلے پہلے پہلے what it means is when you subtract pointers it tells you in a way the distance between the 2 elements that the pointers point it to آپ کو یہ بتایا گا ان کے درمیان کتنے عرے elements ہیں اگر پہلہ pointer y of 0 کو point کر رہا تھا دوسرہ pointer y of 3 کو point کر رہا تھا تو آپ کو جواب 3 دے گا so remember that it in a way interprets و دیتا ٹائپ وہی جو pointر کی دیتا ٹائپ ہے اس کے کتنے units ہیں ان دو pointر کے درمیان so here pointer addition is not allowed but pointer subtraction is allowed and gives you the distance between the 2 pointers in units which are the same as the data type of the pointer so this is an interesting little aside but you can determine things like that ساتھ ساتھ اگر ہم pointers کو increment کر سکتے ہیں pointers کو decrement کر سکتے ہیں pointers کے درمیان میں distance لے سکتے ہیں subtract کر کے تو اور بھی ان کے ساتھ کچھ کر سکتے ہیں can we compare 2 pointers can we say that y1 بڑا ہے یا y2 بڑا ہے the answer is yes you can do that and we normal جیسے ہم if statement کے اندر کرتے ہیں if x is greater than y یہاں پہ ہم لکھ دیں گے if y1 is greater than y2 or greater than or equal to or y1 is equal to y2 double equals سارے comparison چلتے ہیں ان کا مطلب کیا ہے وہ تو program کا context آپ کو بتائے گا کی جنب آپ کمپیر کیا کر رہے ہیں for example اگر آپ کے پاس کوئی sorting کا program ہے تو ہو سکتا ہے کہ آپ کے پاس sorting آپ کوئی ایسی ٹیکنیک استعمال کر رہے ہیں جس میں اریک اندر آپ دو pointers چلار ہیں ایک pointer کہیں اوپر ہے ایک نیچے ہے ایک loop چلی pointers آگے پیچے ہوگئے آپ کو نہیں پتا کہ کنسا آپ آگے ہے کنسا پیچے ہے so you can use these comparison operators saying if y2 is greater than y1 then do something otherwise do something else so you can do all kinds of comparisons now the other thing that you can think of is that is actually fairly obvious that if you say can you compare star y1 with star y2 well that's obvious in the sense that star y1 is a simple value in this case it is the value of the integer that y1 points to so when you say star y1 compared to star y2 that is the simple comparison of two integer variables which is absolutely legal so whenever you use a dereferenced pointer which is جس کے ساتھ star لگاو ہے اس کی value استعمال کر رہے ہیں so all normal arithmetic and manipulations apply whenever you are using the pointers themselves then you can do certain type of operations but there are restrictions on the others try to make a comprehensive list of what you can do with pointers I've already told you quite a lot about it but you should try to experiment and maybe list it down enumerate it write it down for yourself what can you do with a pointer you can place an address in it you can increment it you can increment what it points to if it's of a numeric type and so on going on and looking back at pointers in arrays again let's start with our good old y which is an array of let's say 10 integers and yptr which is a pointer to an integer if we say y of 10 or rather let's say y of 5 ہم نے کا 10 ہیں تو اس کے index جو ہوگا وہ تو 0 to 9 ہوگا so y of 5 کی بات کرتے ہیں y of 5 کو کتنے مختلف طریقیں لکھنے کے let's try to look at them first of all let's start with an assignment which says y array کا starting address جو ہو yptr میں لکھتی آجائے so we just say yptr equals y now we want to print the value of y of 5 first obvious answer see out less than less than y square brackets 5 value print ہو گئی second one see out less than less than star yptr plus 5 کیا فو yptr plus 5 کہاں پہ آئے گا پرانتسیز کہاں پہ لگیں گے کیا star yptr کے ساتھ پرانتسیز لگا کے آپ نے plus 5 کرنا ہے یا بغیر پرانتسیز کے آپ نے plus 5 کرنا ہے what think about it if you said star yptr plus 5 اور جیسے میں نے بولا ہے star yptr کے گد آپ پرانتسیز لگا دیتے ہیں آپ پرانتسیز لگا ہے whatever yptr points to plus 5 will that be the right answer do it and find out another way of doing it I said much earlier in the same lecture کیجی why and yptr in this case are pointing to the same location تو اگر ہم y of 5 لکھ سکتے ہیں can we write yptr of 5 the answer is yes you can this is an alternate notation for using a pointer variable with a subscript you can do that it simply will be in the same thing the fifth element or the sixth element of the array so you have that is a possibility if you say star within parentheses you say yptr plus 5 what does that point to and what is the value there what happens is when you say yptr plus 5 it points to 5 integers away from whatever the location is for yptr but we know that location is y of 0 so when you say yptr plus 5 it is pointing to the sixth element ساری چیز کو پرانتسیز میں ڈال کے بھار ہم نے star لگا دیا which says the value so if you say c out less than less than star parentheses yptr plus 5 what it will mean is print y of 5 وہ بھی ہو سکتا ہے we can do all similar manipulations with the name of the array or with the pointer variable they are almost interchangeable I will repeat what is not interchangeable suppose we had a second array suppose we had q of 10 وہ بھی انتجر ہے at any time you feel like in the program where the logic requires you can have yptr equals y it is now pointing to the beginning of the y array نیچے جاکے you could say yptr equals q and it is now pointing to the beginning of the q array so what we can use the pointers for is pointing to different things at different times in the program I will repeat again you cannot use that with y and q themselves y and q are like constant pointers ان کے لیے میمری میں جگہ پہلے سے at compile time reserve کر دی گئی ہے اور وہ ان کی addressing وہ چینج نہیں کی جا سکتی y will always point to the same memory locations q will always point to the same memory locations yptr is variable جذر مرزی point کرے so quite a useful thing we had a rudimentary example previous times that we used pointers to swap two numbers ایک ان کا major use ایک ان کا major use جو ہے وہ یہی ہے when user call by reference in calling to functions دوسر major use یہاں پہ آتا ہے جب آپ array manipulation کر رہے ہو تھی ایک example اگر آپ دیکھنا چاہیں آپ کے handouts میں بھی دیا ہوگا you can actually step through an entire array using pointers so you can just run a little loop and instead of saying x of j you could actually use a pointer variable starting with the beginning of the array and increment it and go on doing that experiment a lot please write a lot of code and understand how these pointers behave یہ ایک diagram آپ دیکھیں اپنے سکرین کے اوپر یہاں پہ آپ کو دکھائے جاہ رہا ہے کہ یہ ایک array memory میں کیسے جگہ اوپیوپائے کرتی ہے ایک ہم نے pointer لیلی ہے let's say v pointer اس کو جب assign کیا ہے v pointer equal to v تو وہ کس address کو point کر رہا ہے یہ integer array کا ایک سامپل دکھا ہے تو اس میں four four bytes کے فاصلے کے اوپر ہم نے integers کی boundries بھی دکھائے ہوئی ہیں and all I have discussed so far کہ when we increment you should try to understand with the help of this diagram now let us come to strings this is interesting دیکھیں ہمارے پاس جو دیتا ٹائیپس ہیں وہ تو ہیں four int float double what do we do with character strings جہاں پھوڑا لفس استعمال کرنا چاہتے ہیں character strings as the name implies are character arrays so they are arrays of characters so for example if there's a word or a name called amir to store it into one entity you can't store it in a single variable because it's four characters you have to store it in a character array so we can simply declare a character array so we can say four name four name ten let's make it twenty when we declare this it says name is an array of twenty characters fine اس کو assign کیسے کیا جائے وہی سارے rules جو ordinary integer arrays کو اپلائے کرتے تھے یہاں پہ بھی اپلائے کرتے ہیں you can say name of zero equals capital A capital A جو ہے اپلائے کرتے ہیں when ever you enclose something in single quotation marks that represents one character and then when I said one character you should not enclose two characters inside single quotation marks that would be a syntax error then you would say name of one equals single quotes کیا اندر چھوٹا ایم name of two equals single quotes کیا اندر چھوٹا ایم or name of three equals single quotes کیا اندر چھوٹا ایم and single quotes کیا اندر چھوٹا ایم is that enough no it is not enough see کیا اندر and see plus plus کیا اندر and most of these related languages character strings are terminated by a special character was special character ہے the null character all zeros اس کو لکھنے کا طریقہ ہم نے کئی short hand ڈیکھے backslash n was new line the all zeros ڈیکھے its short hand ہے backslash zero جب آپ نے ساری assignment کر لی then next character you must show name of five let's say zero one two three so name of four equals single quotes کیا اندر backslash zero ابھی you may think میں اسی کو نگیٹ کر رہا ہوں because single quotes کیا اندر ایک سے زیادہ character نہیں ہونا چاہئے لیکن جب آپ backslash ڈالتے ہیں like an escape character which says کہ یہ کومبینیشن is to be considered as one character so backslash n was the new line character ڈیکھے backslash t was the tab character single character اسی طریقے سے backslash zero جو ہے is the null character it's a single character which is all zeros اس کی value یہ جو null character ہے یہ ڈیکھے ڈالنے کا فائدہ کیا ہوتا ہے فائدہ دیکھنے کے لیے آپ اسی طرح ایک array ڈیکلیر کریں اس کو initialize کریں کچھ values ڈالیں اور ڈ پے یہ backslash zero ڈال دیں اور پھئے c out کے ساتھ اس کو print کریں اگر یہ ہمارا ڈامپل لیا جائے تو وہاں پہ آپ کو amir نظر آئے گا amir that's it اگر آپ اسی assignment میں سے backslash zero ڈالنا نہ ڈالی ڈالنا بھول جائیں یا explicitly اس کو نکال دیں تو پتہ نہیں چلے گا کہ یہ ڈالنے ختم کہاں ہوتی ہے so the backslash zero ڈالنا is the termination ڈالنا of a character ڈالنا this is important because that means that ڈالنا کوئی characters ڈالنا جس کے اندر 15 ڈالنا وہ up store کرنا چاہتے ہیں تو array ڈالنا پندرہ کی نہیں ہو سکتی وہ 16 کی size کی ہوگی کیونکہ 15 ڈالنا وہ end پے append کرنا پڑے گا so there's a size issue with character arrays ڈالنا which are strings ڈالنا is always terminated by a backslash zero ڈالنا character do we always have to do this the answer is no there are short hands short hand یہ ہے کہ جی جیسے آپ نے declaration کے وقتی string کو initialize کر دیں you can say 4 char name bracket 20 square brackets آگے double quotation marks کے اندر آپ آمر لکھنے amir in double quotes double quotes indicates to the c compiler کہ یہ a character string ہے جیسے ہی compiler کہتا ہے وہ string ہے تو پہلے وہ سارے characters ڈالنا پلس کر کے ساتھ اپنی طرح سے backslash zero ڈالنا لگا دیتا ہے again you cannot store a string of 10 characters in an array of size 10 because that would be an error it would not know where to place the extra character which is a backslash zero array must be at least one character space larger than the number of actual printable characters جو آپ اس میں store کرنا چاہتے ہیں so let's do a little program example you should have this in your handout as well we declare a character string and we initialize it to some value as I just mentioned automatically the compiler will append a backslash zero to this string and put it in that array declare a second array of the same size but don't initialize it so it is an empty array at this time declare two pointers two pointer variables of type character so we say star ptr a comma star ptr b semicolon so these are now two pointers to characters and just trying to show you we can mix pointers and let's say arrays and work with character strings so we are going to manipulate that using this example ptr a میں ہم کیا کرتے ہیں ہم پہلی string کا address رکھتے ہیں so string one کا address where ptr a is equal to string one ptr two or ptr b rather is equal to string two these statements simply put the starting addresses of the arrays into these pointers now let's actually I should have said this earlier what is the objective of this little exercise we are going to copy an array from one to the other a string array so what we do is we run a little loop اب loop کی اندر چلانے کے وقت یا تو ہمیں پتا ہوں کتنے کیتنے کیا کرنے ہیں ایک ایرے سے دوسری ایرے میں دوسرہ طریقہ یہ ہے to look for the terminating character ہم کہتے ہیں کہ ہمیں پتا ہے ہمیں پتا ہے string کے اند پر backslash zero ہوتا ہے so what we can do is simply check for that condition so our while loop says while whatever ptr a points to is not equal to the null character or اس کا سنٹیکس آپ کے سامنے while star ptr a is not equal to single quotes میں backslash zero single quote and that's a comparison this is a comparison of whatever ptr points to this is a comparison of whatever ptr points to this is a while statement ہوجی اتنی در تک کیا کرو اتنی در تک now look at this statement and try to understand it very clearly we have written in the statement star ptr a plus plus equals star ptr b plus plus semi colon ہمیں کافی چیزیں لپیٹ کے ایک لائن میں لکھتی ہیں یا تھوڑے سے c کے programming styles کی طرف جا رہے ہیں not that I recommend it if you're comfortable with it we can do this many other ways but اس لائن کو دیکھیں یہ کریگی کیا سب سے پہلے I hope I read it right کہ the star ptr b plus plus equals star ptr a plus plus سب سے پہلے جو بھی ptr a جس چیز کو point کر رہا ہے وہ assign ہوگا ptr b جس کو point کر رہا ہے اس لوکیشن پہ when this loop starts they are pointing to the beginning of the two arrays سو سٹرنگ1 کا پہلہ کرکٹر وہ سٹرنگ2 کے پہلے کرکٹر کی جگہ پہ کوپی ہو جائے گا اس کے بعد the pointers are incremented not the values they are pointing to سو ptr a is incremented it points to the second element of سٹرنگ1 ptr b is incremented it points to the second element of سٹرنگ2 while test لگتا ہے نل جہاں پہ یہ point کر رہا ہے اگر سٹرنگ کے اندر پانچھے کرکٹر ہیں وہ بھی نل نہیں ہوگا next character assignment ہو جائے گی and so on till you come to the null character in سٹرنگ1 وہاں پہ یہ while loop fail کر جائے گی test fail کر جائے گا now while سے بہر آ جائیں گے کیا کام ختم ہو گیا answer is no what has happened is سٹرنگ2 now has the characters the printable characters that was stored in but it does not yet have the null character at the end so we have to explicitly put it there do we increment something before we put it there the answer is no because اگر آپ وہی while loop کیاندر جو سٹیٹمنٹ کو ہور کریں گے جو pointer b ہے وہ تو increment ہو چکا ہے it is now pointing to the next available location inside the array string too so all you need to do is be equals single quote backslash zero single quote that is the end of the story now you have copied successfully one string into another string using only pointers of course یہ تو example کیلئے ہم نے پیش کیا تھا اسی کام کو خوبصورتی سے لکھنے کیلئے we should use a function so look at the string copy function which is my string copy because it is such a common operation a standard c library may be functions موجود ہیں string copy case but my string copy یہ جو function ہم نے لکھا ہے it takes two arguments it takes a pointer to a character and a pointer to a character and it copies from one to the other so let's give them names let's say the first argument is destination and the first or the second argument is source so the declaration of this function is my string copy four pointer destination comma four pointer source four star source یہاں پہ دیکھے ہم نے ایک لفظ بیچ میں استمال کر لیا source کیا پہلے ہم نے four pointer سے پہلے ہم نے کہدیئے a const const four pointer source یہ کیا کرتا ہے تھوڑ سے اس کی بات کر لیتے ہیں پھر body تو سامنے آپ کے it is very simple سورس میں چیز لکھی ہوئی تھی اس کو ہم destination میں copy کرنا چاہتے ہیں destination تو چینج ہوگی کیونکہ اس کے اندر values لکھی جائیں گی کیا source چینج ہونا چاہئے source must not change in this case we are using source on the right hand side and assigning to destination which is the left hand side value just to make doubly sure ہم یہ const کیا کرتے ہیں یہاں پے اگر آپ نیچے body of the function کے اندر source کو modify کرنے کی کوشش بھی کریں گے تو compiler ہی error پکڑ لے گا کہ جناب یہ آپ نے const کہا ہے you cannot modify or change the values in the array source so it's a safety feature keep that in mind whenever you are using pointers and call by reference body دیکھیں تو body تو اب سیمپلسی ہے وہی while whatever source points to is not null whatever destination points to incremented equals whatever source points to incremented or logic وہی ہے جو میں نے ابھی explain کیا تھا پہلے assignment ہوگی star source کی value جو ہے star destination والی جگہ پے لکھی جائے گی پھر دونوں علیدہ علیدہ increment ہوگے while loop complete ہو جائے گی جب null character مل جائے گا while ختم ہو کہ آپ بہر آئے تو destination میں اخیر پے اپنے طور پے null character لکھنا نہیں بھولنا are the way to terminate a character string and the function returns why did we not return anything from this function because we have already used pointers in this function it is automatically a call by reference remember میں نے کہا تھا جب arrays پاس ہوٹی ہے arrays کے نام ہم بھیکھے بھیجتے ہیں وہ gotematically call by reference ہے یہ نہیں destination array کے اندر چیزیں لکھی Clinique لکھی گئی ہوگی اگر یہ simple variables ہوتے تو فھر آپ کو خیال رکنا تھا رکھنا تھا کہ جی اگر آپ ویریابل کالنگ پروگرم میں چینج کرنا چاہتے ہیں تو اس کا ایڈریس بھیجیں اگر سیر پھر سے کوئی کومپیوتیشن کرنا چاہتے ہیں تو اس کی ویڈیو بھیجیں in the case of arrays it is always a case of a call by reference the value will be written in the original array so in this case we don't need to return anything we have successfully copied the source to the destination array so what have we covered today we have looked at the very close relationship between pointers in arrays we have looked at some rudiments of pointer arithmetic pointers کو increment کیسے کیا جاتا ہے decrement کیسے کیا جاتا ہے we have seen کہ arrays کی اندیکسن کرتے ہیں تو pointers کی اندیشن کر کے وہی اندیکسن کا effect اچیب ہو جاتا ہے ہم نے یہ بھی دیکھا کہ جی pointers اور arrays کے نام جو ہم تقریبا انٹر چینجبلی استعمال ہو سکتے ہیں pointers are bigger than arrays but for the moment جب ہم pointers اور arrays کی بات کریں تو تقریبا انٹر چینجبلی آپ subscription notation استعمال کر لیں یا simple increment notation استعمال کر لیں کچھ چیزیں جو میں highlight کی تھی وہ دو ہراتہ چلوں کہ ایرے کا نام جو ہے وہ ہے تو pointer لیکن وہ constant pointer ہے so you cannot reassign it to anywhere else جو ordinary pointer ہے اس کو تو آپ جب مزیر reassign کرنا چاہیں کر سکتے ہیں manipulation of arrays آپ simple loop or subscripted variables کے ساتھ کر لیں یا pointers کے ساتھ کر لیں اس کے بعد ہم نے تھوڑا سا string arrays کے اوپر بات کی اور string arrays کے اوپر ہم نے تھوڑا سی اس کی special بات یہ کی کہ string arrays کی اندر ہمیشہ اند پے ایک string کے اند کے اوپر ایک null character ہوتا ہے جو بتاتا ہے کہ یہ string ختم کہاں ہو رہی ہے جب آپ اس کو پرنٹ کرنا چاہیں تو وہ ایسی لی پرنٹ ہو سکے اور وہاں پے terminate کر سکیں so ان چیزوں کا آپ خیال رکھیں and please experiment with it and do something interesting declare an integer x declare an integer pointer اس کے بعد take the address of x put it in the pointer print out the value of the pointer and the value that it points to in other words print out the address and print out the value that it points to confirm کی وہی ہو رہے جو آپ سوچ رہتے ہونا چاہیے do the same with a character array and come on the discussion board and tell me what is the difference کیا ایڈرس آپ کا پرنٹ ہو سکا ہے کی نہیں ہو سکا let me know till next time we will continue our discussion of pointers کیونکہ ابھی تو بہت کچھ کور کرنے والا ہے اُتنی دیتاک کے لیے جازتیجے خدا حافظ