سلام.
کاراکتر * نمایانگر اشارگر ها هست و کاراکتر & نمایانگر ارجاع ها و وقتی در قسمت خروجی یک تابع می آیند یعنی خروجی این تابع یک اشارگر یا یک ارجاع میباشد.
یک مطلبی رو هم الان به ذهنم رسید میگم شاید مفید باشه!
در ظاهر این دو کاراکتر یک عمل رو انجام میدهند و اون عمل همونطور که میدونید انتقال آدرس یک شی میباشد. اما این دو تفاوت های زیاد و کارایی های متفاوتی دارند!
این دو کاراکتر از هر لحاظ قابل مقایسه با یکدیگر هستند برای مثال چند نمونه از تفاوت های این دو:
1- اشارگر ها قابلیت اختصاص پیاپی دارند اما ارجاع ها چنین قابلیتی ندارند و باید توسط مقدار دهی اولیه مقدار دهی شوند:
اشارگرها:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ارجاع ها:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
2- شما میتوانید یک سطح تودر تو از اشارگر ها ایجاد کنید اما ارجاع ها چنین قابلیتی ندارند:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
3- یک اشارگر در اصل یک متغییر میباشد (به اندازه 4 بایت در سیستم های 32 بیتی) که مقدار آن آدرس شیئی هست که به آن اشاره میکند اما ارجاع ها با توجه به پیاده سازی ایی که دارند دقیقا برابر هستند با آدرس شی و حتی در برخی از کامپایلر ها کارکتر & یک عملگر زمان کامپایل میباشد یعنی در زمان کامپایل مقدار آن محاسبه شده و جایگزین میشود.
4- اشارگر ها میتوانند شامل مقدار 0 یا null باشند اما تخصیص مقدار 0 یا null به یک ارجا در حالت عادی امکان ندارد:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یک نکته امنیتی در این مثال وجود دارد. وقتی که ورودی/خروجی یک تابع اشارگر باشد درصد بروز خطا در هنگام استفاده از اون تابع بسیار زیاد میباشد. سعی کنید در حد ممکن از ارجاع ها بجای اشارگر ها در بخش ورودی/خروجی تابع ها استفاده کنید.
دلیل: فرض کنید شما از تابعی در برنامه خود استفاده کرده اید که خروجی آن یک اشارگر میباشد. شما بدون هیچ گونه بررسی مستقیما از خروجی این تابع استفاده میکنید و همانطور که در مثال قبل گفتم امکان وجود مقدار 0 یا null در اشارگر ها وجود دارد. با این حساب اگر به هر دلیلی آن تابع مقدار null برگرداند و شما قصد استفاده از مقدار null به عنوان یک شی را داشته باشید , برنامه سریعا کرش شده و بسته میشود. اما در ارجاع ها امنیت بیشتری وجود دارد و میشه گفت تضمینی هست برای اینکه یک ارجاع همواره به یک شی نسبت داده شده است و در حالت معمول هیچوقت یک ارجاع مقدار null ندارد.
و ....
در کل مبحث ارجاع ها و مخصوصا اشارگرها کمی مفصل هست و پیشنهاد میکند اگر قصد استفاده از اشارگرها را در برنامه های خود دارید حتما قبل از آن اطلاعاتتونو راجبش کامل کنید و کاملا بهش مسلط بشید.