7. یا رشتهString
const char* str="This is a string";
const char str[]={'T','h','i‘,...,'g',0};
گر اشارهvoid*
int* pi = &i;
void* pv = pi;
تابع به گر اشاره
int f(char c, float f);
int (*pf)(char, float) = f;
8. 1. // Count the number of occurrences of x in p[]
2. // p is assumed to point to a zero-terminated
3. // array of char (or to nothing)
4. int count_x(char* p, char x)
5. {
6. if (p == nullptr) return 0;
7.
8. int count = 0;
9. for (; *p!=0; ++p)
10. if (*p == x)
11. ++count;
12. return count;
13. }
در این ویدیو می خوام در مورد آرایه و اشاره گر ها و ارتباط بین اونا و referenceها یا ارجاع ها صحبت کنم.
آرایه یک ساختمان داده ست که یک تعداد متغییر که از یک Typeهستند رو پشت سرهم قرار میده.
برای تعریف آرایه کافیه مثل تعریف متغییر؛ type و اسم اون رو بنویسم و بعد داخل کروشه باز و کروشه بسته؛ تعداد عناصر پشت سر هم از اون type رو مشخص کنیم. توی این مثال یک آرایه 20تایی از متغییر های کاراکتری به نام c تعریف کردیم.
برای دسترسی به عناصر آرایه باید اسم اون آرایه رو بنویسیم و در کروشه باز بسته شماره عنصری که می خوایم رو بنویسیم. اولین عنصر در آرایه از صفر شروع میشه و آخرین عنصر یکی از تعداد عناصر آرایه کمتره. اصطلاحا به شماره عنصری که بهش میخوایم دسترسی داشته باشیم index میگیم.
برای پیمایش آرایه می تونیم از حلقه هایی که در ویدیوی قبلی یاد گرفتیم استفاده کنیم.
دراین مثال 2 آرایه با 10 تا عنصر به نامهای v1 و v2 رو declare کریم.
آرایه ی v1 رو به این صورت مقدار دهی اولیه کردیم. یک آکولاد باز و یک آکولاد بسته می نویسیم و مقادیر اولیه هر عنصر رو به ترتیب می نویسیم و با یک کاما از هم جدا میکنیم. این خط یعنی عنصر صفر رو مساوی عدد صفر قرار بده، عنصر یک رو مساوی یک قرار بده و الی آخر. و v2 رو مقدار دهی اولیه نکردیم. در C++ هر متغییری که Declare میکنید اگر مقدار دهی اولیه نکنید یک عددی درونش قرار خواهد گرفت که معلوم نیست مقدارش چیه. پس باید سعی کنید همیشه به متغییر هایی که declare می کنید مقدار اولیه بدید.
بعد در حلقه for عناصر آرایه ی v1 رو ریختیم توی v2. یعنی تک تک عناصر v1 رو کپی کردیم توی عناصر متناظر در v2. عنصر صفرم از v1 رو رختیم توی عنصر صفرم v2 و عنصر یکم v1 رو توی عنصر یکم v2 و الی آخر.
در مثال دوم عناصر داخل آرایه رو روی صفحه چاپ کنیم .
در اینجا تعداد عناصر رو مشخص نکریم در نتیجه تعداد عناصر آرایه با تعداد مقادیری که جلوش برای مقدار اولیه دادن نوشتیم مشخص میشه. تعداد اونا هر چند تا باشه؛ تعداد عناصر آرایه برابر اون میشه.
و در حلقه for هم تک تک عناصر رو روی صفحه چاپ کردیم.
در این مثال میبینید که میشه عملیات ریاضی روی عناصر یک آرایه انجام داد.
یک آرایه 10تایی تعریف کردیم و با مقادیر صفر تا 9 مقدار اولیه دهی کردیم.
در حلقه for آرایه رو پیمایش کردیم و هر عنصر آرایه رو با اپراتور ++ یکی اضافه کردیم. بعد از اینکه حلقه اجرا بشه عناصر آرایه از 1 تا 10 خواهند شد.
با استفاده از pointer یا اشاره گر به محل یا آدرس یک متغییر در حافظه اشاره می کنیم. با داشتن آدرس یک متغییر میتونیم به طور غیر مستقیم به اون متغییر دسترسی داشته باشیم و عملیاتی رو روی اون انجام بدیم.
برای تعریف اشاره گر ابتدا type اون رو مشخص می کنیم و بعد از type یک * میگذاریم و بعد اسم اون رو می نویسیم.
برای مقدار اولیه دادن باید از یک علامت & استفاده کنیم. اگر جلوی هر متغییر یک & بذارید این اپرتور آدرس اون متغییر رو در حافظه به شما بر میگردونه و میتونید اون آدرس رو در pointer ذخیره کنید.
به صورت شماتیک می بینیم که اشاره گر p داره به عنصر سوم آرایه ی v اشاره می کنه.
این فلش به معنی اشاره کردن به آدرس یک متغییر هست که در اشاره گر ریخته شده.
اگر بخوایم اشاره گر رو طوری مقدار اولیه بدیم که هنوز به جایی اشاره نکنه می تونیم اونو با Nullptr مقدار دهی کنیم. Nullptr یک مقدار خاصیه که به معنی هیچ جاست و فقط می تونیم از اون برای اشاره گر استفاده کنیم.
در این اسلاید چند تا اشاره گر خاص رو بررسی می کنیم
رشته یا string یکی از پرکاربردترین چیزهایی هستند که ما باهاشون سروکارداریم. یک سری از حروف الفبا که پشت سرهم قرار گرفته باشند رو رشته می گیم. از رشته ها برای ذخیره کردن پیغامها یا نامها استفاده میشه
برای تعریف رشته به این صورت عمل می شه. یک اشارهگر کاراکتری که یک const هم قبلش می ذاریم. به این معنا که به یک پیغام اشاره می کنه که محتوای اون ثابته و تغییر نمیکنه.
وقتی شما یک رشته تغریف می کنید کامپایلر به این صورت عمل می کنه یک آرایه کاراکتری جای اون میذاره که آخرین عنصر اون آرایه با صفر مقدار دهی شده. پس تعداد عناصر رشته برابر تعداد حروف و spaceهایی که در اون نوشته شده بعلاوه ی یک.
در ویدیوی دوم در مورد typeها صحبت کردیم اگر یادتون باشه یکی از typeهایی که گفتیم void بود و گفتیم زمانی که از type اطلاعاتی نداشته باشیم از نوع void استفاده می کنیم. اشاره گر از نوع void می تونه به هر typeیی اشاره کنه. یک مثال از اون رو می بینیم.
گاهی خیلی خوبه که یک اشاره گر به یک تابع داشته باشیم. برای اشاره کردن به یک تابع با این صورت عمل می کنیم. فرض کنید که امضای تابع به این صورت باشه.
برای تعریف اشاره گر به اون باید امضای اون رو بنویسیم و با پرانتز یک * قبل از اسم اشاره گر مشخص کنیم که یک اشاره گر به تابع هست.
برای پیمایش آرایه می شه از اشاره گر استفاده کرد.
در این مثال یک تابع داریم که تعداد تکرار حرف x رو در آرایه ی کاراکتری p میشماره و برمی گردونه. p یک رشته است که در انتهای اون یک صفر قرارداره. در خط 6 در صورتی که اشاره گر به هیچ جا اشاره نکنه مقدار صفر رو بر میگردونه.
یه متغییر به نام count تعریف کردیم که تعداد تکرار رو باهاش میشماریم.
در حلقه for هم تعداد تکرار رو شمردیم. به این صورت که در شرط if چک کردیم که اگر مقدار p برابر x بود یکی به مقدار count اضافه میکنیم.
همون طور که گفتم در داخل اشاره گر آدرس یک متغییر ذخیره شده و برای اینکه به مقدار خود متغییر دسترسی داشته باشیم باید به صورت غیر مستقیم عمل کنیم برای این کار باید قبل از اشاره گر یک علامت * بگذاریم. به این کار می گیم de refference کردن اشاره گر یعنی برو به آدرسی که در اشاره گر هست و مقدار آون رو برای من بیار.
با ++ کردن یک pointer مقدار اون رو به اندازه ی سایز متغییر که به اون اشاره می کنه اضافه می کنیم یعنی به متغییر بعدی اشاره می کنه.
و در آخر هم مقدار count رو بر گردوندیم.
Reference یا ارجاع مشابه pointer هست. یعنی با استفاده از reference می تونیم به یک متغییر دیگه ارجاع بدیم و یک عملیاتی رو روی اون انجام بدیم ولی بر خلاف pointer که به صورت غیر مستقیم این کار رو میگردیم با referenece به صورت مستقیم به اون متغییر دسترسی داریم.
برای تعریف reference باید type رو مشخص کنیم و بعد از type یک علامت & میذاریم و اسم اون رو مینویسیم.
Reference یک نکته خیلی مهم داره و اونم اینه که وقتی یک reference تعریف می کنید حتما باید مقدار دهی اولیه بکنیدش و نمی تونید اونو مقدار دهی نکنید. چون reference مستقیم عمل میکنه پس نمی تونه به هیچ جا ارجاع نده. در نتیجه reference دقیقا مثل خود اون متغییر هست که بهش ارجاع شده و هر کاری که روی reference انجام بدین درست مثل اینه که روی خود اون متغییر انجام دادین.
پس مثال های بالا غلط هستند.
و باید به این صورت باشند.
مطالبی که گفتیم رو جمع بندی کنیم. در این ویدیو در مورد تعریف کردن آرایه ها و دسترسی به عناصر آرایه گفتیم. و pointerها رو معرفی کردیم که میتونن آدرس یک متغییر رو نگه دارند و به صورت غیر مستقیم به یک متغییر اشاره کنن و در آخر reference رو گفتیم که بر خلاف pointer به صورت مستقیم یک متغییر رو نگه می داره و دسترسی مستقیم به اون متغییر رو فراهم میکنه
امید وارم مفید بوده باشه
با تشکر