PDA

View Full Version : چند سوال در تعریف رشته به کمک اشاره گر ها



md3848
چهارشنبه 28 بهمن 1394, 14:27 عصر
سلام
در کد زیر وقتی اجراش کنی کلمه ali3 نمایش داده میشه....
حالا سوالات من :
1) پایان این رشته به صورت خودکار کاراکتر پایانی(با کد اسکی 0) قرار میگیره؟
2) تو خط دوم، اومدیم و گفتیم که آدرس خودنه اول رو نشون بده(چون color3Ptr یه اشاره گر هستش و color3Ptr* باید مقدار خونه اول رو نشون بده یعنی باید a رو نشون بده که وقتی تست کردم همینو نشون داد و مشکلی باهاش ندارم، و اگه به صورت color3Ptr فراخونیش کنیم یعن آدرس خونه اول یا همون آدرس a در حافظه باید نمایش داده بشه ولی میاد و کد رشته رو نشون میده....چرا؟)
const char *color3Ptr = "ali3";
cout << color3Ptr;

Ananas
چهارشنبه 28 بهمن 1394, 15:36 عصر
سلام.
جواب سوال اول : بله. در آخر بعد از کاراکتر های 'a' و 'l' و 'i' و '3' کاراکتر صفر قرار میگیره.
جواب سوال دوم: چون color3Ptr اشاره گری به نوع char هست و یک رشته محسوب میشه پس دستور cout متن رشته رو چاپ میکنه چون اینطور براش تعریف شده. اگر میخواید آدرس (یعنی محتوای عددی این متغیر) رو چاپ کنید باید یک تبدیل نوع انجام بدید:

#include <iostream>
#include <stdint.h>

int main()
{
const char * color3Ptr = "ali3";
std::cout << (intptr_t)color3Ptr;

getchar();
getchar();
}

که البته به جای intptr_t میتونید از int هم استفاده کنید ولی intptr_t با اشاره گر سایزش هماهنگه.

md3848
پنج شنبه 29 بهمن 1394, 00:45 صبح
دمت گرم داش


چون اینطور براش تعریف شده.
جان داش قانع نشدم.....


که البته به جای intptr_t میتونید از int هم استفاده کنید ولی intptr_t با اشاره گر سایزش هماهنگه.
راستی intptr_t هم جز انواع تبدیل داده هستش؟ میشه یه مطلب در این زمینه معرفی کنی بهم.....در باره انواع تبدیل من سرچ کردم قبلا ولی اینو ندیدم....جزو تبدیل های ضمنی هستش؟

md3848
چهارشنبه 05 اسفند 1394, 14:27 عصر
کسی نیست داششو راهنمایی کنه؟

haniyeh.ghassami
پنج شنبه 06 اسفند 1394, 03:10 صبح
این یک رفرنس :


(http://stackoverflow.com/questions/10398304/is-intptr-t-a-signed-counterpart-of-uintptr-t-and-vice-versa?answertab=votes#tab-top)§7.18.1.4 Integer types capable of holding object pointers The following type designates a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer:
intptr_t
(http://stackoverflow.com/questions/10398304/is-intptr-t-a-signed-counterpart-of-uintptr-t-and-vice-versa?answertab=votes#tab-top)
اینم یکی دیگه (http://en.cppreference.com/w/cpp/header/cstdint)

Ananas
جمعه 07 اسفند 1394, 17:44 عصر
دمت گرم داش


جان داش قانع نشدم.....


راستی intptr_t هم جز انواع تبدیل داده هستش؟ میشه یه مطلب در این زمینه معرفی کنی بهم.....در باره انواع تبدیل من سرچ کردم قبلا ولی اینو ندیدم....جزو تبدیل های ضمنی هستش؟
مورد اول:char * یعنی یک اشاره گر به یک یا تعدادی کاراکتر 8 بیتی. cout رو هم یک تابع ببینید که برای این نوع (یعنی char *) اینطور تعریف شده که اون رشته رو چاپ کنه. هر کاراکتری یک کد داره که به هر char وقتی عددی رو نسبت میدیم یعنی کد اسکی کاراکتر ای رو نسبت دادیم. قرارداد هست که مثلا حرف A کد اسکیش باشه 65 و یا حرف a کد اسکی-ش باشه 97.

مورد دوم: ببینید intptr_t یک نوع عدد صحیح هست. منظور از اسمش int pointer type هست. و بسته به اینکه برنامه ی شما 32 یا 64 بیتی باشه این نوع هم 32 بیت یا 64 بیت تعریف میشه. و چون دارید از اشاره گر استفاده میکنید پس بهتره به عدد صحیحی تبدیل کنیم که از نظر سایز هم اندازه ی یک اشاره گر باشه. ینی 32 بیتی یا 64 بیتی. پس از intptr_t استفاده کردم که همیشه با اشاره گر هام هماهنگ باشه.