PDA

View Full Version : توضیح در مورد struct



hosseinam1370
شنبه 18 مرداد 1393, 00:42 صبح
سلام.

دوستان شما این کد رو در نظر بگیرید :
int main()
{
int *age;
int *name;
int m = 2;
int n = 3;
age = &m;
name = &n;
system("pause");
};

خوب این کد درست هست و مشکلی هم نداره.
ولی چرا این کد ، مثل کد بالا عمل نمیکنه؟
#include "stdafx.h"
#include <iostream>
using namespace std;
struct info
{
int name;
int age;
};
int main()
{
struct info *hossein;//be in khat ke hossein esharegar shod nega konid
int m = 2;
int n = 3;
hossein.age = &m;
hossein.name = &n;
system("pause");
};




الان hossein از نوع info هست که داخلش 2 تا متغییر هست خوب ، و متغییر hossein هم اشاره گر تعریف شده ، پس متغییرهای hossein هم باید از نوع اشاره گر باشند دیگه< پس چرا اینطوری نیستن؟


با تشکر.

C3phalex1n_0x
شنبه 18 مرداد 1393, 07:36 صبح
#include <iostream>
using namespace std;


struct info{
int *name;
int *age;
};


int main()
{
info hossein;//be in khat ke hossein esharegar shod nega konid
int m = 2;
int n = 3;
hossein.age = &m;
hossein.name = &n;
printf("The value inside it is %d and %d.\n", *hossein.age, *hossein.name);
system("pause");
};

hosseinam1370
شنبه 18 مرداد 1393, 08:51 صبح
ممنون از پاسختون
ولی من دنبال اینم که ببینم که hossein الان چه وضعیتی داره، یا کامپایلر با hossein چه برخوردی میکنه، حالا که استراکت hossein از نوع اشاره گر شد ، چه اتفاقی براش میافته؟

#include "stdafx.h"
#include <iostream>
using namespace std;
struct info
{
int name;
int age;
};
int main()
{
struct info *hossein;

system("pause");
};

C3phalex1n_0x
شنبه 18 مرداد 1393, 08:58 صبح
سلام، من خودم در برنامه نویسی C تازه کار هستم، اما تا آنجا که من می دانم؛ وقتی شما یک ساختار تعریف می کنید، آن ساختار مانند یک نوع داده جدید عمل می کند. با این تفاصیر، وقتی ما می گوییم info *hossein مانند این است که بگوییم int *a لذا پس هر چه که از یک اشاره گر معمولی انتظار می رود با اندک تفاوت هایی باید از این ساختار هم انتظار داشت.
.

sa1378
شنبه 18 مرداد 1393, 08:58 صبح
ممنون از پاسختون
ولی من دنبال اینم که ببینم که hossein الان چه وضعیتی داره، یا کامپایلر با hossein چه برخوردی میکنه، حالا که استراکت hossein از نوع اشاره گر شد ، چه اتفاقی براش میافته؟

#include "stdafx.h"
#include <iostream>
using namespace std;
struct info
{
int name;
int age;
};
int main()
{
struct info *hossein;

system("pause");
};




وقتی استراکت رو اشاره گر تعریف میکنید فقط میتونه به یه استراکت دیگه اشاره کنه و تغییری در متغییر های توش انجام نمیشه

rahnema1
شنبه 18 مرداد 1393, 09:28 صبح
ولی من دنبال اینم که ببینم که hossein الان چه وضعیتی داره، یا کامپایلر با hossein چه برخوردی میکنه، حالا که استراکت hossein از نوع اشاره گر شد ، چه اتفاقی براش میافته؟



در کداول age و name هر جفتشون اشاره گر بودند

اما در کد دوم hossein را اشاره گری به یک شیء از نوع info تعریف کردید اما به کدام شیء قراره اشاره کنه؟ به عبارت دیگه باید یک شیء وجود داشته باشه که شما بتونید بهش اشاره کنید کد زیر را ببنید تا براتون روشن بشه

info hossein1;
info *hossein2;
hossein2=&hossein1;
//info *hossein2=&hossein1;
hossein1.age=2;
cout<< hossein2->age;
hossein2->name= 14
cout< hossein1->name;


ثانیا وقتی hossein اشاره گر شد به معنی این نیست که اعضای اون شیئی که hossein به اون اشاره می کنه اشاره گر باشند
همچنین با استفاده از حافظه پویا هم میشه یک شیئی که قراره اون اشاره گر بهش اشاره کنه را در حافظه ایجاد کرد

info *hossein=new info;
int m = 2;
int n = 3;
hossein->age = m;
hossein->name = n;

hosseinam1370
شنبه 18 مرداد 1393, 10:35 صبح
ممنون از دوستان تقریبا دارم میفهمم چخبره.

جناب rahnema1 مثالتون در درک مطلب بسیار کمک کرد.
ولی یه سوال هم پیش اومد و اون این که:
ببینید در این کد به متغییر اشاره گر یه حافظه میده و داخل اون حافظه آدرس متغییر رو قرار میده :
int main()
{
int *p;
int h = 22;
p = &h;
cout << p;//masalan adress = 0x11111111
system("pause");
};

ولی تو این کد که رفتارش باید با کد بالا تقریبا برابر باشه ،چرا داخل متغییر hossein2 که از نوع استراکت هست ، نمیآد آدرس متغییرهای داخل hossein1 که یه مقداری دارن رو بگیره ذخیره کنه؟
با f10 رفتم ، دیدم مقدار hossein1 رو گرفت ذخیره کرد داخل hossein2 که اشاره گر بود.
#include "stdafx.h"
#include <iostream>
using namespace std;
struct info
{
int name;
int age;
};
int main()
{
struct info hossein1;
struct info *hossein2;
hossein1.age = 22;
hossein1.name = 33;
hossein2 = &hossein1;
system("pause");
};


با تشکر.

rahnema1
شنبه 18 مرداد 1393, 11:56 صبح
ممنون از دوستان تقریبا دارم میفهمم چخبره.

جناب rahnema1 مثالتون در درک مطلب بسیار کمک کرد.
ولی یه سوال هم پیش اومد و اون این که:
ببینید در این کد به متغییر اشاره گر یه حافظه میده و داخل اون حافظه آدرس متغییر رو قرار میده :
int main()
{
int *p;
int h = 22;
p = &h;
cout << p;//masalan adress = 0x11111111
system("pause");
};

ولی تو این کد که رفتارش باید با کد بالا تقریبا برابر باشه ،چرا داخل متغییر hossein2 که از نوع استراکت هست ، نمیآد آدرس متغییرهای داخل hossein1 که یه مقداری دارن رو بگیره ذخیره کنه؟
با f10 رفتم ، دیدم مقدار hossein1 رو گرفت ذخیره کرد داخل hossein2 که اشاره گر بود.
#include "stdafx.h"
#include <iostream>
using namespace std;
struct info
{
int name;
int age;
};
int main()
{
struct info hossein1;
struct info *hossein2;
hossein1.age = 22;
hossein1.name = 33;
hossein2 = &hossein1;
system("pause");
};


با تشکر.

توی مثال دوم شما آدرس hossein1 را گرفتید و فقط اون آدرس را در hossein2 ذخیره کردید
بنابراین hossein2 چیزی بیشتر از یک اشاره گر نیست
یک نکته دیگه اینه که باید ببینیم یک نوع اصلی هست یا مرکب. مثلا info یک نوع مرکب هست زیرا دو تا زیر شیء اصلی از نوع int داره به نام age و name داره اما int یک نوع «اصلی» است که دیگه از چیزی تشکیل نشده

sa1378
شنبه 18 مرداد 1393, 13:38 عصر
در کداول age و name هر جفتشون اشاره گر بودند

اما در کد دوم hossein را اشاره گری به یک شیء از نوع info تعریف کردید اما به کدام شیء قراره اشاره کنه؟ به عبارت دیگه باید یک شیء وجود داشته باشه که شما بتونید بهش اشاره کنید کد زیر را ببنید تا براتون روشن بشه

info hossein1;
info *hossein2;
hossein2=&hossein1;
//info *hossein2=&hossein1;
hossein1.age=2;
cout<< hossein2->age;
hossein2->name= 14
cout< hossein1->name;


ثانیا وقتی hossein اشاره گر شد به معنی این نیست که اعضای اون شیئی که hossein به اون اشاره می کنه اشاره گر باشند
همچنین با استفاده از حافظه پویا هم میشه یک شیئی که قراره اون اشاره گر بهش اشاره کنه را در حافظه ایجاد کرد

info *hossein=new info;
int m = 2;
int n = 3;
hossein->age = m;
hossein->name = n;


منم منظورم همین بود دیگه
استراکت اشاره گر میتونه به استراکت های دیگه اشاره کنه ولی متغییر هاش معمولی میمونن

rahnema1
شنبه 18 مرداد 1393, 13:44 عصر
منم منظورم همین بود دیگه
استراکت اشاره گر میتونه به استراکت های دیگه اشاره کنه ولی متغییر هاش معمولی میمونن

ببخشید میخواستم حرف hosseinam1370 را نقل قول کنم اشتباها توضیحات شما را نقل قول کردم