การใช้พอยต์เตอร์ และ Dynamic Allocation
ในบทนี้เราจะมาพูดถึงการใช้พอยต์เตอร์และ
Dynamic Allocation กันครับ
|
|
|
|
#include <iostream.h>
int main()
{
int *pt1;
int *pt2;
int one=1;
int two=2;
pt1=&one;
*pt1=*pt1+two;
*pt2=two;
two=two+1;
cout<<*pt1<<"\n";
cout<<*pt2<<"\n";
cout<<one<<" "<<two;
return 0;
}
|
|
|
|
|
[Download Code]
การสร้างตัวแปรชนิดพอยต์เตอร์ก็คือการใช้เครื่องหมาย
* นำหน้าชื่อตัวแปรครับ ในตัวอย่างเราได้สร้างพอยต์เตอร์ชนิด integer ขึ้นมา
2 ตัว และตัวแปรธรรมดาอีก 2 ตัวครับ จากนั้นเราก็ให้ที่อยู่ของ one แก่ pt1
โดยใช้เครื่องหมาย & ครับ จากนั้นเราก็บวกข้อมูลของพอยต์เตอร์ด้วย two
อันนี้หมายความว่า พอยต์เตอร์เรานั้นชี้ไปที่ one ดังนั้น เมื่อบวกค่าของพอยต์เตอร์ด้วย
two ค่าของ one ก็จะถูกบวกด้วยเหมือนกัน
จากนั้นเราก็ให้ pt2 ชี้ไปที่ค่าของ
two ไม่เหมือนอันแรกนะครับ ดังนั้นถ้าเราเปลี่ยนค่าของ two พอยต์เตอร์จะไม่เปลี่ยนตามไปด้วย
และเช่นเดียวกันถ้าเราเปลี่ยนค่าของ pt2 ค่าของ two ก็จะไม่เปลี่ยนตามไปด้วยครับ
|
|
|
|
#include <iostream.h>
int main()
{
int *pt1,*pt2;
int index=10;
pt1=&index;
pt2=pt1;
cout<<index<<" "<<*pt1<<" "<<*pt2;
return 0;
}
|
|
|
|
|
[Download Code]
ตัวอย่างนี้ก็แสดงวิธีการใหค่าพอยต์เตอร์แก่พอยต์เตอร์เท่านั้นเองครับ
การให้ฟังก์ชั่นเปลี่ยนค่าและส่งค่ากลับ
จากที่ผมเคยอธิบายในเรื่องค่าที่เราส่งไปให้ฟังก์ชั่นนั้นเป็นเพียงค่าก็อปปี้
ไม่ว่าเราจะไปเปลี่ยนค่ามันอย่างไร เมื่อกลับมาในส่วนของเมนค่ามันก็ยังเท่าเดิม
แต่ถ้าเราต้องการให้ค่าที่ส่งมาเปลี่ยนไปด้วย เราก็จะต้องใช้พอยต์เตอร์นี่ล่ะครับช่วย
|
|
|
|
#include <iostream.h>
void set(int height,int *lenght);
int main()
{
int h=170;
int l=60;
cout<<"Height ="<<h<<"\n";
cout<<"Lenght ="<<l<<"\n";
set(h,&l);
cout<<"Height ="<<h<<"\n";
cout<<"Lenght ="<<l<<"\n";
return 0;
}
void set(int height,int *lenght)
{
height=100;
*lenght=50;
cout<<"Height ="<<height<<"\n";
cout<<"Lenght ="<<*lenght<<"\n";
}
|
|
|
|
|
[Download Code]
หลังจากรันโปรแกรมออกมาก็จะเห็นว่า
การพิมพ์ค่าของ height ในฟังก์ชั่นนั้นมีค่าคือ 100 แต่พอมาพิมพ์ในส่วนของเมนค่าของ
height ก็จะมีเท่าเดิมคือ 170 ต่างจากค่าของ lenght ที่เมื่อเปลี่ยนค่าแล้วถึงจะกลับมาในส่วนของเมน
ค่าก็ยังเปลี่ยนอยู่ครับ
พอยต์เตอร์กับฟังก์ชั่น
|
|
|
|
#include <iostream.h>
void square(void);
void three(void);
void (*pt)(void);
int main()
{
square();
pt=square;
pt();
pt=three;
pt();
return 0;
}
void square(void)
{
cout<<"Square"<<"\n";
}
void three(void)
{
cout<<"three"<<"\n";
}
|
|
|
|
|
[Download Code]
ตัวอย่างนี้แสดงให้เห็นถึงการใช้พอยต์เตอร์
ซึ่งเป็นพอยต์เตอร์ที่ชี้ไปที่ฟังก์ชั่นครับ ตัวอย่างนี้ไม่มีอะไรใหม่คงไม่ต้องอธิบายนะครับ
Dynamic Allocation
|
|
|
|
#include <iostream.h>
struct person
{
int one;
};
int main()
{
int *pt1,*pt2;
int index=10;
char *name;
person *people;
pt1=new int;
*pt1=100;
pt2=new int;
*pt2=index;
name=new char[10];
name="Vikingdev";
people=new person;
cout<<*pt1<<" "<<*pt2<<" "<<name;
delete pt1;
delete pt2;
delete people;
delete[] name;
return 0;
}
|
|
|
|
|
[Download Code]
dynamic allocation ก็เปรียบเสมือนตัวแปรตัวหนึ่ง
แต่ต่างกันตรงที่ dynamic allocation นั้นจะเป็นตัวแปรที่อยู่ในเมมโมรี่
ดังนั้นจึงจะไม่ใช้พื้นที่ในฮาร์ดดิสต์ การสร้าง dynamic allocation ก็คือจะต้องสร้างพอยต์เตอร์ขึ้นมาก่อน
จากนั้นก็ใช้คำสั่ง new แล้วตามด้วยชนิดของตัวแปร จะมีคำสั่งที่ผมยังไม่ได้พูดถึงนั่นก็คือ
struct แต่จะพูดในบทต่อไป ที่ผมต้องนำมาใช้ในตอนนี้ก็เพื่อแสดงวิธีการใช้คำสั่ง
new ว่าถ้าตัวแปรนั้นเป็น structure ก็ต้องตามด้วยชื่อของ structure แทนครับ
ที่น่าสังเกตในตัวอย่างนี้ก็คือหากต้องการสร้าง
dynamic allocation ที่เป็น char หากต้องการกำหนดจำนวนอะเรย์ด้วย ก็ให้ทำแบบตัวอย่างครับ
และคราวนี้ที่เพื่อนๆ ควรจะจำนั่นก็คือ เมื่อเป็นอะเรย์แล้วไม่จำเป็นต้องใช้
* นำหน้านะครับ
ก่อนจะจบโปรแกรมเราก็จะต้องใช้คำสั่ง
delete เพื่อทำลายตัวแปรที่เป็น dynamic allocation ครับ ที่น่าสังเกตก็คือ
การลบอะเรย์จะต้องใช้ delete[] นะครับ
|