• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

آموزش C++ سي پلاس پلاس از پايه

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
سلام سالک عزیز
در مورد مدیریت و این حرفها باید بگم خودت بهترین انتخابی و اما د رمورد سئوالی که کرده بودی با اجازه بقیه اساتید:
قبل از اینکه سئوال 16 یا 32 بیتی رو در موردش بحث کنیم بهتر یه بیشینه در مورد اجرا فایل های اگزه توسط ویندوز داشته یاشیم :

هنگامی که یه فایل اگزه اجرا میشود . ابتدا درستی این فایل از نظر ساختار چک میشود سپس یه ماشین مجازی بر اساس نوع برنامه تشکیل داده میشود که داری حافظه مشخص ای است. این حافظه میتواند ثابت یا متغییر باشد . اگر برنامه تحت داس اجرا شود ( یعنی 16 بیتی ) این جافظه تا مقدار مشخصی میتواند افزایش پیدا کند . یعنی تا ادرس دهی 16 بایتی یعنی 65538 بایت یا 64 کیلو ( اگر باز هم برنامه احتیاج به حافظه داشته باشد از حافظه توسعه داده شده این حافظه گرفته میشود که در واقعه همان گرفتن حافظه در بخش heap است که مقدار ماکزیمم گرفتن ادرس اگر درست یادم باشه 64 مگ است ) برنامه میتواند از استیک استفاده نمایید. اگر هم برنامه تحت ویندوز نوشته شده باشد تا 4 گیگ میتواند حافظه را ادرس دهی و استفاده نمایید. در این حال بر عکس برنامه های تحت داس تمامی مموری پشته توسط stake ادرس دهی میشود . در این حالت محدودیت های سیستم مثل مقدار حافظه ای که دارد ( یا مقدار فضای که حافظه مجازی در نهایت میتواند اخذ کند) یا مقدار حافظه ای که برنامه های دیگر گرفته اند ، مقدار حافظه ( تند یا ram ) گرفته شده توسط برنامه را محدود میکند نه عدم یا محدودیت نوع فایل اجرایی . البته در بعضی از حالت مثل برنامه های 16b بازهم محدودیت های فایل اجرایی داریم .

برنامه های 32 بیتی تحت سیستم عامل ویندوز اجرا میشوند . پس تمامی برنامه های داس که باید توسط شل یا ماشین مجازی ای که حالت ادرس دهی داس را ( 16b ) شبیه سازی میکنند اجرا شود 16 بیتی هستند.


اما در مورد حافظه ویرچوال :
حافظه مجازی یا حافظه شبیه سازی شده یا حافظه تولید شده توسط paging file ، حافظه است که توسط سیستم عامل ویندوز از نسخه 3.1 تا کنون ( فکر کنم برای یونیکس به ان حافظه swap شده میگویند) برای حل یک مشکل ارائه گردید:
هنگامی که برنامه ای اجرا میشود ( فرض کنید فایل اجرایی 32 بیتی است و تحت یک ویندوز 98 با سیتمی با رم 64 مگ اجرا گردیده است ) بر اساس تعریف و ادرس دهی 32 بایتی یعنی اجازه دسترسی به 2 به توان 32 بایت ، برنامه میتواند به 4 گیگ حافظه دسترسی پیدا کند ، اما کامپوتر همش 64 مگ رم دارد پس از یک فایل موقت برای قسمت های از برنامه که در داخل رم جا نمیشوند ( بعلت پر شدن ان) استفاده میشود که به ان حافظه مجازی میگویند .

virtual memory
Temporary storage used by a computer to run programs that need more memory than it has. For example, programs could have access to 4 gigabytes of virtual memory on a computer's hard drive, even if the computer has only 32 megabytes of RAM. The program data that does not currently fit in the computer's memory is saved into paging files.

در ضمن در بعضی از مواقع شما برنامه ای را اجرا میکنید و برای مدت ای که کم هم نیست از برنامه استفاده نمیکنید
در این حالت ویندوز برای خالی کردن رم دستگاه برای اجرای برنامه های بعدی یا برنامه ای که شما هم اکنون اجرا کرده اید کل برنامه را به رم مجازی که کند است انتقال میدهد و در نتیجه شما برنامه خود را با سرعت بالا توسط رم دستگاه که سریع است اجرا مینماید . برای مثال اگر شما برنامهای مثل فوتو شاپ را برای زمان طولانی کوچک کنید هنگامی که برنامه را توسط taskbar دوباره صدا زده یا فعال میکنید مدتی طول میکشدتا برنامه بصورت کامل نمایش داده شود و در این حالت اگر به چراق هاردنظری بی افکنید استفاده از هارد نمایش داده میشود که بعلت انتقال برنامه از حافظه مجازی به حافظه رم است ( حافظه مجازی بروی هارد شبیه سازی میشود )

همانطور که دیده میشود تصمیم بر استفاده از این حافظه و یا عدم استفاده از ان توسط هسته سیستم عامل اتخاذ میشود و نه برنامه نویس پس ممکن است برنامه تحت داس هم از این ویرچوال مموری استفاده نماید.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
توضيحات شما كامل و بي نقص بود. من خودم كلي احساس آرامش كردم بعد خواندن اينها. مي دانيد كه من به بيت و بايت علاقه دارم. و از اينكه 2 را 16 بار يا 32 بار در خوش ضرب كنم لذت مي برم. البته سوادم هم، در حد همين ضرب دو ها، در هم است.

من دوست دارم بحث حافظه را به دلايل بالا ادامه دهم ولي اختيار تاپيك دست علاقه من نيست. پس خيلي چيزهاي ديگه كه مونده را بحث مي كنيم.مثل رشته و شايد باز آرايه و اشاره گر و تابع. به نظر من توضيحات شما كاملا كافي است.
و با توجه به سطح پايين آموزش ، بقيه اين بحث را ، بعد چند لايه ، بحث هاي مربوط به فصول ديگر پي مي گيريم.البته مي خواستم كمي با استك كار كنيم كه شايد گفتم.

راجع به طبقه بندي و جدا كردن مطلب هم من آخرش نتوانستم به نتيجه برسم. از پست اول راجع به متغير بحث شده تا پست 280 ، چطوري ميشه اين پستها را جابجا كرد؟ فكر كنم يك نفر مسلط به آموزش نياز باشد كه من نيستم. كسي كه مثلامولف كتاب باشه و بداند فصول را چطور تنظيم كند تا پيش نياز و پس نيازها مشكل ساز نشود.
يك دليل ديگر هم اينه كه در بعضي فصول فقط چند پست معدود زده شده كه نميشه به عنوان تاپيك يا فايل جدا در نظر گرفته شود.
كلا سي خيلي وسيعه و بايد چند هزار پست بخورد كه ارزش فصل بندي داشته باشد.
آقا سعيد واقعا شما دلسوزانه وقت گذاشتيد براي كمك به آموزش اينجا.
راجع به خودم بايد بگم: ((لو لا سعيد لهلك سالك.)) يعني بي كمك شما نمي دانم چه شرايطي پيش مي آمد.
.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
بابا این چه حرفی سالک جان نمیدونم منظورم رو خوب تونستم بیان کنم یا نه . بعضی از چیزها با تجربه و فهمیدن این تجربه ها حاصل میشه . بخاطر همین نمیدونم توستم کاملا توضیح بدم یانه .
عزیز من کلا مباحث کمی در مورد سی میدونم بیشتر توی کارم با این مباحث اشنا شدم و همانطور که قبلا هم گفتم هیچم . هیچ هیچ . تواضع از این حرف ها هم نیست واقعا وقتی یه چیزهای رو توی همین مبحث های که شما و دوستان گفتند می خونم میبینم که هیچی نمیدونم .
درضمن یاد یه گفته افتادم
همه چیز را همگان دانند و همگان هنوز زاییده نشده اند.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام.
دقيقا من هم بخاطر همين اصرار بر بحث دارم تا تبادل تجربه بشه. كتاب علاوه بر اين كه بي جان است و با آدم ارتباط برقرار نمي كنه ، فاقد تجربه است. در بحثه كه تجربه ها منتقل ميشه و تئوري ها در عمل به كار نمي آيند و با تجربيات ديگران است كه ميشه كار را شروع كرد.
.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
به نقل از mostafa_gm :
تو C نميدونم ولي تو ++VC حافظه stack رو ميشه تا 2 گيگ و روي حافظه مجازي تخصيص داد.
VC++ یک زبان 32 بیتی است پس محدود حافظه اش کمتره
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
سلام

سالک جان تبریک می گم :) :D

یه مدت نبودم چون رو مرز اخراجی وایسادم .:wacko:

ببخشید می پرم وسط بحث.
پست های قدیمی رو می خوندم به یه سئوالی رسیدم که به درک VC++ کمک می کنه .

گفته بودید که می دونیم یه برنامه ممکنه چندیدن فایل h. داشته باشه ولی مگه میشه که یه برنامه چند تا فایل cpp. داشته باشه . چون بعضی برنامه ها که می گیریم اینطوریند.

جواب : بله میشه !!

میشه یک پروژه ایجاد کرد و همه فایلهای مربوط به برنامه رو به اون اضافه کرد و بعد پروژه رو اجرا کرد تا همه فایلها کامپایل شوند. ولی فقط یک فایل cpp. باید تابع main رو داشته باشه .

compiler خودتون رو اجرا کنید باید یک گزینه project در منوی برنامه ببینید که مربوط به همین موضوع میشه (Borland Turbo C++ ver3.0 که این گزینه رو داره ) . می تونید از open project استفاده کنید تا یک پروژه رو باز کنید . اگر در شاخه example بگردید احتمالا یک پروژه می بینید. این فایلها با پسوند prj. ذخیره می شوند.

VC++ رو اجرا کنید . بعد یک پروژه MFC ایجاد کنید ، به tab مربوط به فایلها برید همونطور که گفته بودید می بینید که به ازای هر کلاس یک فایل cpp. و یک فایل h. ایجاد شده . در فایل h. معمولا تعریف کلی کلاس مطرح میشه مثل تعریف متغییر ها و شکل کلی توابع و خصوصی و عمومی بودن اونها ، ولی در cpp. متن اصلی توابع کلاس مطرح میشه .

شبیه به اینکار رو میشه در C++ معمولی هم انجام داد . کافیه به ازای هر کلاس دو فایل به همون صورت که گفته شد ایجاد کنید ، در فایل cpp. باید فایل h. مربوطه include بشه . بعد در یک پروژه تمام این فایلها اضافه بشند و در فایل cpp. اصلی هم فقط فایلهای h. مربوطه include بشند. من این کار رو قبلا انجام دادم و شد.

علاوه بر اینکه اینکار باعث میشه که برنامه خیلی منظم بشه ، قابلیت های جالب دیگه ای هم داره که من یکیش رو شنیدم و اون اینه که می تونید فایلهای obj. رو هم به پروژه اضافه کنید .

اگر شما یک برنامه بنویسید و اون رو به obj. تبدیل کنید می تونید به دیگران بدید یا بفروشید .شما فقط به اونها توابع موجود در فایل رو معرفی کنید . در نتیجه بدون اینکه سورس برنامه لو بره و دیگران به سورس برنامه دسترسی داشته باشند می تونند از اون استفاده کنند.;) :cool:
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
اندك اندك ، اندك اندك ،
جمع مستان مي رسند.
اندك اندك ، اندك اندك ،
مي پرستان مي رسند.
پاك بازان ،، سرفرازان ، مي رسند.
- - - - - - - - - - -- - - -- - - -
من ابتدا open project را در توربو سي زدم.


296a1.gif


و بعد نامي به پروژه خود دادم و در my document ذخيره كردم.


296a2.gif


بعد add item را زدم.


296a3.gif


بعد دو فايل .cpp كه قبلا ساخته بودم را add كردم.


296a4.gif


در شكل زير، در پنجره پايين توربو سي ، مي بينيم كه فايلها به پروژه كه نامش myp است اضافه شده اند.


296a5.gif


محتواي فايلهاي من اين ها بود:

کد:
#include <iostream.h>
#include <conio.h>

void second_cpp();[color=red]//This is prototype [/color] for myfunction in second cppfile.



void main()
{
clrscr();

cout<<"main"<<endl;

second_cpp();

getch();
}

کد:
#include <iostream.h>
#include <conio.h>

void second_cpp()
{
cout<<"second cpp"<<endl;
}

بعد از منوي run ، روي run كليك كردم. نتيجه اجرا در پايين مي بينيد:


29688.gif


البته اين اولين باره كه من پروژه ام را با دو cpp راه مي اندازم. قبلا تمام فايلهاي ديگر را header مي كردم. و فقط فايل اولي را cpp مي كردم. ممنون از دوست عزيز. البته اون جوري هم اجرا مي شد ولي اين جوري فكر كنم اصولي تره و درست تره.
مانورهاي بعدي را خودتان تجربه كنيد ، ديگه من به ساده ترين شكل كار كردم. پروتوتايپ تابعي كه در cpp دوم بود را هم مجبور شدم در cpp اول قرار بدهم. ولي هنوز نمي دانم كه جاهاي مجاز ديگه كجاست.
اينكلودها را هم من مجبور شدم در هر دو فايل قرار دهم. با تركيب فايلهاي
.cpp & .h
خوتان ور برويد تا ببينيد اينكلودها را كجا بايد گذاشت.
حالا در my document من يك فايل دارم به اسم myp.prj كه هر وقت خواستم مي توانم با باز كردن اين پروژه خيلي سريع ، دو فايل كه از قبل درونش add شده را با هم اجرا كنم.
.
=======================
نكاتي را كه راجع به وي سي فرموده بوديد را هم رفتم موبمو اجرا كردم و مقايسه كردم. خيلي مفيد بود و خيلي كمكم كرد. ممنون. ولي مطرح كردنش را مي گذارم براي تاپيك وي سي.تا سي با وي سي قاطي نشه.
=======================
اين دو آدرس را هم يك نگاه بزنيد:
http://cpp.blogfa.com/
http://cplusplus.blogfa.com/
ربطي به بحث نداره. يهو چشمم خورد.
در هر دو سايت چيزهاي خوبي پيدا ميشه.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام.
اين برنامه فكر كنم براي جا افتادن كدهاي اسكي و اسكن خوب باشه.
در اين برنامه هر كليدي را كه بزنيد، كد آن را نشان مي دهد. دو تا getche قرار داده ايم ، زيرا بعضي كليد ها مثل arrow ها و delete و غيره ، دو كد دارند . كد اسكن و كد اسكي.
اميدوارم مفيد باشه.

کد:
#include<iostream.h>
#include<conio.h>

void main(void)
{
  clrscr();
  char c,ch1,ch2;
do
     {
    cout<<">>";
  ch1 = getche();
  cout<<",";
  ch2 = getche();
  cout <<"="<< (int) ch1 <<","<< (int) ch2<<endl;
  cout<<"press any key for continue.x(exit)"<<endl;
    c=getch();
     }while (c!='x');

}


a4.gif


منبع:
http://forum.majidonline.com/forum111/thread49129.html
 

once4ever

کاربر تازه وارد
تاریخ عضویت
3 فوریه 2006
نوشته‌ها
62
لایک‌ها
2
ممنون جالب بود.
بازم از این کارها بکن ;)
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
فرق اين دو تا چيست؟

کد:
int

کد:
(int)

با تشكر.

به نقل از programmer :
سلام سالک جان

از (int) برای تبدیل نوع استفاده میکنن.

به این کد نگاه کن:

کد:
#include<iostream.h>
#include<conio.h>

int main()
{
 int x=0;
 char c='a';
 x=(int)c;
 clrscr();
 cout<<c<<"=>"<<x<<endl;

 getch();
 return 0;
}

c یک کاراکتر است و x یک عدد صحیح .

همونطور که میدونید هر کاراکتر یک کد اسکی داره.

وقتی (int) رو قبل از c قرار میدیم کامپایلر معادل عددی c را در x قرار میدهد.

حالا این کد رو هم ببین :

کد:
#include<iostream.h>
#include<conio.h>

int main()
{
 int x=65;
 clrscr();
 cout<< (char)x <<endl;

 getch();
 return 0;
}

دستور cout کاراکتری را که کد اسکی آن x است را در خروجی نمایش میدهد.

این یکی هم که واضحه :

کد:
#include<iostream.h>
#include<conio.h>

int main()
{
 float f=3.9999;
 int x;
 clrscr();
 x=(int)f;
 cout<< x <<endl;
 getch();
 return 0;
}
به نقل از mohammad_110 :
(int) باعث میشه نتیجه به int تبدیل شود.
کد:
float f,ff;
ff=3.454;
f=(int)ff;
مقدار f ، عدد 3 می شود.
این روش یک کاربرد هم در کلاس های مشتق شده داره:
کد:
#include<stdio.h>
#include<conio.h>

class CBase{
 public:
   void print(){printf("\na");}
};

class CSub:public CBase{
 public:
   void print(){printf("\naa");}
};

void main(){
 clrscr();

 CBase bt;
 CSub  st;

 bt.print();
 st.print();

 CBase *pbt;

 pbt=&bt;
 pbt->print();

 pbt=&st;
 [COLOR="Red"]pbt->print();
 ((CSub*)pbt)->print();[/COLOR]
 getch();
}
خروجی این برنامه به این صورت است:
کد:
a
aa
a
[COLOR="Red"]a
aa[/COLOR]
احتمالا برای شما این مثال مبهم هست . سئوال بپرسید راحتتر میشه ابهام رو بر طرف کرد.
ولی اصلش اینه که کد قرمز رنگ دومی باعث میشه اشاره گر کلاس مبنا به اشاره گر زیر کلاس تبدیل بشه بنابراین تابع زیر کلاس به جای تابع کلاس مبنا اجرا میشه.
البته این روش ممکنه کاربرد های دیگه هم داشته باشه.
با تشكر از اساتيد گرامي.
.
----------------------------
يك مثال جالب در اين رابطه:

کد:
#include <iostream>
using namespace std;

int dog, cat, bird, fish;

void f(int pet) {
  cout << "pet id number: " << pet << endl;
}

int main() {
  int i, j, k;
  cout << "f(): " << (long)&f << endl;
  cout << "dog: " << (long)&dog << endl;
  cout << "cat: " << (long)&cat << endl;
  cout << "bird: " << (long)&bird << endl;
  cout << "fish: " << (long)&fish << endl;
  cout << "i: " << (long)&i << endl;
  cout << "j: " << (long)&j << endl;
  cout << "k: " << (long)&k << endl;
} ///:~

کد:
نتيجه اجرا
f(): 4198736
dog: 4323632
cat: 4323636
bird: 4323640
fish: 4323644
i: 6684160
j: 6684156
k: 6684152
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
ساده ترين تابع بازگشتي كه فكر كنم بشه نوشت اين باشه.

کد:
#include <iostream.h>
#include <conio.h>

[color=blue]void my_function(int a);[/color]

void main(void)
{
  clrscr();
	   [color=red] my_function(7); [/color] //ehzare tabeye_baz gashti
     getch();
}

[color=blue]void my_function(int a)  
{
		  cout<<"a="<<a<<endl;
	    a=a-1;
		 if (a>0)  my_function(a);
}[/color]

تابع بازگشتي ، تابعي است كه خود را صدا مي كند. طبيعي است كه بايستي شرطي بگذاريم كه تا ابد ، اين صدا كردن ادامه نداشته باشه.


a4.gif

 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
یه تابع بازگشتی خوب چهار شرط داره

1. حتما خودش رو یه جایی فرخوانی کنه
2. یه شرط خاتمه یا حالت پایه ای داره که جوابش از قبل معلومه و لازم به فراخوانی مجدد تابع نیست
3. به تمام ورودی ها پاسخ بده
4.از نتایج بدست اومده در مراحل قبلی استفاده کنه و ماسبات قبلی رو تکرار نکنه
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با تشكر از توضيحات كامل و خوب شما.
در برنامه زير چگونگي رفت و برگشت تابع بازگشتي را نشان داده ام.

کد:
#include <iostream.h>
#include <conio.h>

void my_function(int a);
void main(void)
{
  clrscr();
	    my_function(7);  //ehzare tabeye baz_gashti
     getch();
}

void my_function(int a)
{
	cout<<"a="<<a<<endl;
	    a=a-1;
		 if (a>0)  my_function(a);
	 cout<<"a+10="<<a+10<<endl;
}


a6.gif

 

sima_c

کاربر تازه وارد
تاریخ عضویت
21 می 2006
نوشته‌ها
30
لایک‌ها
0
من متغیری از نوع رشته ای تعریف کردم اما وقتی مقدار میدم تا فاصله رو در اون ذخیره میکنه چکار بکنم که کامل دخیره کنه ؟
مثلا : Ali akbari می خوام هر دو در رشته ذخیره شه ولی Ali فقط ذخیره میشه
 

Arman_BTC

کاربر تازه وارد
تاریخ عضویت
28 فوریه 2006
نوشته‌ها
138
لایک‌ها
1
با این روش میتونید space و tab رو بخونید
کد:
#include<iostream.h>
int main (){
char str[20];
cin.get(str,20);
cout<<str;
return 0;
}
البته با کلاس string هم میشه ولی کامپایلر من جواب نمیده
 

A.S.Roma

کاربر تازه وارد
تاریخ عضویت
9 می 2006
نوشته‌ها
24
لایک‌ها
0
با سلام
در ادامه فرمايشات آقا آرمان ...
مي توانيد از تابع cin.getline نيز استفده كنيد. ( رشته را تا موقع Enter زدن مي خواند.)
به همان شكل cin.get
 

sima_c

کاربر تازه وارد
تاریخ عضویت
21 می 2006
نوشته‌ها
30
لایک‌ها
0
از دستور آرمان استفاده کردم ولی از من رشته نمیگیره و میره قسمت بعد برنامه .
دقیقا دستور آرمان رو نوشتم در برنامه . اما بعد اجرا اصلا از من رشته نمیگره میره قسمت بعد
 

MahdiΩ

کاربر تازه وارد
تاریخ عضویت
27 ژانویه 2006
نوشته‌ها
324
لایک‌ها
0
سلام

از دستور آرمان استفاده کردم ولی از من رشته نمیگیره و میره قسمت بعد برنامه .
دقیقا دستور آرمان رو نوشتم در برنامه . اما بعد اجرا اصلا از من رشته نمیگره میره قسمت بعد

راجع به تابع get و توابع مشابهش توی اون یکی فروم (delphi_stu) کاملا توضیح دادم بگردی پیداش میکنی.

اگه لازم شد اینجا هم کپی میکنم.
 

MahdiΩ

کاربر تازه وارد
تاریخ عضویت
27 ژانویه 2006
نوشته‌ها
324
لایک‌ها
0
پیاده سازی تابع get یه مقدار عجیبه.
ببینید یه بافر درونی برای تابع get در نظر بگیرید.یعنی جایی که کاراکترهایی رو که از keyboard میخونه رو اونجا نگه میداره و بعد از اونجا میریزه توی متغیر رشته ای ما.
همه توابع get که توی برنامه مینویسید از همون یه بافر استفاده میکنن.
این کد رو اجرا کنین تا منظورم رو بهتر بفهمید:

وقتی برنامه درخواست وارد کردن رشته s1 رو کرد شما دقیقآ این رشته رو وارد کنید : salamqqsalam
نتیجه برنامه رو بررسی کنید به جواب سوالاتتون میرسید.

کد:
#include<iostream.h>
#include<conio.h>

int main()
{
 char *s1="";
 char *s2="";
 clrscr();
 cout<<"enter s1:";
 cin.get(s1,10,'q');

 cin.get();
 cin.get();

 cout<<"S1="<<s1<<endl;
 cout<<"\nenter s2:";
 cin.get(s2,6);
 cout<<endl<<"S2="<<s2<<endl;

 cout<<"\n\n\n ++++++++  END  ++++++++";
 getch();
 return 0;
}

این هم لینک مستقیم به صفحه مذکور.
 
بالا