PDA

View Full Version : دو سوال از اشاره گر ها



hercules_3d
یک شنبه 18 تیر 1385, 21:44 عصر
با سلام
سوال اول : وقتی یه آرگومانی رو به صورت pass by reference اونم با pointer به یه تابع میفرستیم اون موقع خود آدرس اون آرگومان به تابع فرستاده میشه یا کپی آدرس آرگومان؟
سوال دوم : کد زیر رو در نظر بگیرید
توی کتاب دیتل نوشته وقتی توی لیست پارامتر یه تابع مینویسیم int p[] کامپایلر اونو تبدیل به int *const p میکنه حالا با توجه به این گفته p یه اشاره گر ثابته که نمیتونه به جای دیگه ای غیر از a2 اشاره کنه با این حال چرا انتساب a1 به p باعث syntax error نمیشه وبه راحتی کامپایل میشه و جواب درست میده؟

hercules_3d
دوشنبه 19 تیر 1385, 06:09 صبح
اینم کد :

#include <iostream>

using std::cout;
using std::endl;
#include <conio.h>

void arra( int [], int );

int a1[ 4 ] = { 0 };

int main()
{
int a2[ 4 ] = { 1, 1, 1, 1 };

arra( a2, 4 );

_getch();
return 0;

}


void arra( int p[], int s )
{
for ( int i = 0; i < 4; i++)
cout << p[ i ] << " ";
cout << endl;
p = a1;
for ( int i = 0; i < 4; i++)
cout << p[ i ] << " ";
cout << endl;

}

hercules_3d
دوشنبه 19 تیر 1385, 15:07 عصر
کسی نیست کمک کنه؟

mzjahromi
دوشنبه 19 تیر 1385, 15:30 عصر
اون چیزی که شما مطرح کردید کپی اشاره گر

once4ever
دوشنبه 19 تیر 1385, 16:05 عصر
1. شاید متوجه سوالت نشدم ولی هردو چیزی که مطرح کردی در مورد برنامه نویسی یک معنی میده. ولی ازنظر اینکه بتونی تصور کنی چه اتفاقی میافته. بله کپی از آدرس منتقل میشه.
(میتونی به من بگی فرق اینکه کپی ارصال بشه یا خودآدرس چیه؟!!)

کدی که نوشتی درواقع کپی از آرایه a2 رو به p انتقال میده. و همچنین درمورد a1

hercules_3d
سه شنبه 20 تیر 1385, 13:22 عصر
با سلام
مگه این عبارت p = a1 باعث نمیشه که مقدار p برابر آدرس a1 شه؟ در واقع حالا p هم مثل a1 داره به ابتدای آرایه ی a1 اشاره میکنه ( همون کپی a1 یا a2 )
سوال : آیا مطلب زیر درسته؟
توی کتاب دیتل نوشته وقتی توی لیست پارامتر یه تابع مینویسیم int p[] کامپایلر اونو تبدیل به int *const p میکنه
با فرض درست بودن وقتی p یه اشاره گر ثابت باشه دیگه نمیتونه به جایی غیر از a2 (آرگومان متناظر با p ) اشاره کنه و با توجه به این مطالب باید انتساب a1 به p با ارور همراه شه ( چون p یه اشاره گر ثابته ) ولی هیچ اروری رخ نمیده ؟؟؟! یعنی کامپایلر int p[] رو به int *const p تبدیل نمیکنه؟

hercules_3d
سه شنبه 20 تیر 1385, 13:23 عصر
با سلام
مگه این عبارت p = a1 باعث نمیشه که مقدار p برابر آدرس a1 شه؟ در واقع حالا p هم مثل a1 داره به ابتدای آرایه ی a1 اشاره میکنه ( همون کپی a1 یا a2 )
سوال : آیا مطلب زیر درسته؟
توی کتاب دیتل نوشته وقتی توی لیست پارامتر یه تابع مینویسیم int p[] کامپایلر اونو تبدیل به int *const p میکنه
با فرض درست بودن وقتی p یه اشاره گر ثابت باشه دیگه نمیتونه به جایی غیر از a2 (آرگومان متناظر با p ) اشاره کنه و با توجه به این مطالب باید انتساب a1 به p با ارور همراه شه ( چون p یه اشاره گر ثابته ) ولی هیچ اروری رخ نمیده ؟؟؟! یعنی کامپایلر int p[] رو به int *const p تبدیل نمیکنه؟

hercules_3d
سه شنبه 20 تیر 1385, 13:23 عصر
با سلام
مگه این عبارت p = a1 باعث نمیشه که مقدار p برابر آدرس a1 شه؟ در واقع حالا p هم مثل a1 داره به ابتدای آرایه ی a1 اشاره میکنه ( همون کپی a1 یا a2 )
سوال : آیا مطلب زیر درسته؟
توی کتاب دیتل نوشته وقتی توی لیست پارامتر یه تابع مینویسیم int p[] کامپایلر اونو تبدیل به int *const p میکنه
با فرض درست بودن وقتی p یه اشاره گر ثابت باشه دیگه نمیتونه به جایی غیر از a2 (آرگومان متناظر با p ) اشاره کنه و با توجه به این مطالب باید انتساب a1 به p با ارور همراه شه ( چون p یه اشاره گر ثابته ) ولی هیچ اروری رخ نمیده ؟؟؟! یعنی کامپایلر int p[] رو به int *const p تبدیل نمیکنه؟

hercules_3d
سه شنبه 20 تیر 1385, 13:23 عصر
با سلام
مگه این عبارت p = a1 باعث نمیشه که مقدار p برابر آدرس a1 شه؟ در واقع حالا p هم مثل a1 داره به ابتدای آرایه ی a1 اشاره میکنه ( همون کپی a1 یا a2 )
سوال : آیا مطلب زیر درسته؟
توی کتاب دیتل نوشته وقتی توی لیست پارامتر یه تابع مینویسیم int p[] کامپایلر اونو تبدیل به int *const p میکنه
با فرض درست بودن وقتی p یه اشاره گر ثابت باشه دیگه نمیتونه به جایی غیر از a2 (آرگومان متناظر با p ) اشاره کنه و با توجه به این مطالب باید انتساب a1 به p با ارور همراه شه ( چون p یه اشاره گر ثابته ) ولی هیچ اروری رخ نمیده ؟؟؟! یعنی کامپایلر int p[] رو به int *const p تبدیل نمیکنه؟

once4ever
سه شنبه 20 تیر 1385, 16:05 عصر
مگه این عبارت p = a1 باعث نمیشه که مقدار p برابر آدرس a1 شه؟
نه! هردو آدرس متفاوتی دارند و فقط باعث میشه که هرچی درآدرس a1 هست در آدرس p قرار بگیره.

hercules_3d
سه شنبه 20 تیر 1385, 22:41 عصر
با سلام
شرمنده از اینکه پست قبلیم چند بار تکرار شد:خجالت:
واقعا قاطی کردم :گیج:

نه! هردو آدرس متفاوتی دارند و فقط باعث میشه که هرچی درآدرس a1 هست در آدرس p قرار بگیره.
منظورتون اینه که محتوای a1 ( مقادیر درون آرایه a1 ) در p قرار بگیره؟!!
حالا این کد رو داشته باشین

#include <iostream>

using std::cout;
using std::endl;
#include <conio.h>

void arra( int [], int );

int a1[ 4 ] = { 0 };

int main()
{
int a2[ 4 ] = { 1, 1, 1, 1 };

cout << "a2 is : " << a2 <<endl;
arra( a2, 4 );

_getch();
return 0;

}


void arra( int p[], int s )
{
for ( int i = 0; i < 4; i++)
cout << p[ i ] << " ";
cout << endl;
cout << "a1 is : " << a1 << endl;
cout << "p is : " << p << endl;
p = a1;
cout << "a1 is : " << a1 << endl;
cout << "p is : " << p << endl;
for ( int i = 0; i < 4; i++)
cout << p[ i ] << " ";
cout << endl;

}

مگه این عبارت p = a1 باعث نمیشه که مقدار p برابر آدرس a1 شه؟
نه! هردو آدرس متفاوتی دارند
خروجی نشون میده قبل از انتساب a1 به p آدرس p برابر آدرس a2 هست بعد از انتساب a1 به p آدرس p برابر آدرس a1 هست؟؟؟!!!:گیج:

sianooshonline
دوشنبه 09 مرداد 1385, 14:15 عصر
ببخشید میخواستم یه قضیه اصلاح بشه:
کامپایلر int p[] رو به Const int *p تبدیل میکند نه به int *Const p