หวัดดีคร้าบท่านผู้อ่านทุกท่าน บทนี้จะนำเสนอเรื่องการจองอาเรย์แบบที่ปรับเปลี่ยนขนาดได้!!!

ปรับเปลี่ยนได้ไม่ได้หมายถึง จองไว้ 10 แล้วกลางโปรแกรมหดเลือห 5 แล้วยืดไป 7 อะไรแบบนี้นะครับ
(ทำได้รึเปล่าไม่รู้แฮะ) แต่หมายถึงว่า เราสามารถให้โรแกรมกำหนดขนาดตอนจองได้(อ่าว งงละสิ)

คืองี้ครับ ปกติเวลาเราจองอาเรย์ เราก็จะประกาศแบบนี้(สมมติจอง 100 ช่อง)

int array[100];

ซึ่งหมายความว่า ไม่ว่าเราจะรันกี่ร้อยกี่พันครั้ง มันก็จะจองให้เรา 100 ช่อง

สมมติเราทำโปรแกรมเก็บอายุนักเรียน แบบเขียนครั้งเดียว แจกให้ทุกโรงเีรียนทั่วประเทศ ถ้าโรงเรียนนึง
 มี 100 คน อีกโรงเรียนมี 200 คน อีกโรงเรียนมี 500 คน เราก็ต้องประกาศอาเรย์ถึง 500 ช่องถูกมั้ยครับ
ถ้าน้อยกว่านี้ โรงเรียนสุดท้ายก็จะมีอาเรย์ไม่พอ แต่ถ้าประกาศ 500 ช่อง โรงเรียนแรกซึ่งต้องการใช้
แค่100 ช่อง ก็จะเสียหน่วยความจำไปฟรีๆ400ช่อง การสร้างตัวแปรแบบ Dynamic จึงได้ถือกำเนิดขึ้น!!!

ก่อนอื่น ทุกคนควรจะมีความู้เรื่อง pointer มาบ้างนะครับ เพราะจำเป็นสำหรับบทนี้

วิธีการคือ เวลาเราประกาศ เราไม่ต้องไปประกาศเป็นอาเรย์ครับ ให้ประกาศเป็น pointer ไปเลย!!!

int* dnm;

จากนั้น เราก็จัดการบอกโปรแกรมว่า ต้องการให้มันมีกี่ช่อง ด้วยฟังก์ชันแบบนี้

dnm = ( int *)malloc(size * sizeof(int));

ชนิดข้อมูลไม่จำเป็นต้องเป็น int นะครับ อย่างอื่นก็ได้ แต่ต้องประกาศเป็นพอยเตอร์ชนิดนั้นๆ
แล้วก็เปลี่ยนคำว่า int ตรง malloc เป็นชื่อชนิดข้อมูลนั้นๆด้วย

size : ขนาด หมายถึงจำนวนช่อง ใส่เป็นตัวแปรได้(นี่คือสิ่งที่ทำให้มันเป็น dynamic เพราะการ
ประกาศอาเรย์ปกติใส่ตัวแปรไม่ได้ ยกเว้นตัวแปรค่าคงที่) เช่นถ้าให้ประกาศ 10 ช่องก็ใส่เลข 10 ถ้าให้
ประกาศ n ช่องก็ใส่ตัวแปร n เข้าไปได้เลย

เวลาใช้งาน เราก็ลืมไปเลยว่ามันเป็น pointer ครับ ใช้งานเหมือนอาเรย์ได้ทุกประการ

แต่มีข้อยกเว้นคือ เมื่ไหร่ที่เราไม่ต้องการมันอีก เราต้องทำการ free มันครับ ไม่งั้นมันจะเป็นเนื้อที่
ที่ใช้งานไม่ได้อยู่ในหน่วยความจำ(รกนั่นเอง) วิธํี free ก็คือ

free(ชื่อตัวแปร);

เช่น

free(dnm);

หลังจากที่ free ไปแล้ว เราจะใช้งานตัวแปรอาเรย์ไดนามิกที่เราสร้างขึ้นไม่ได้อีก ถ้าอยากใช้งาน
ต้องจับมันมา malloc อีกครั้ง

ตัวอย่างโปรแกรม

#include   [stdio.h ] // change  [ , ] to < , >

int main()
{
    int* p;
    int n,i;
    printf("How many element in array : ");
    scanf("%d",&n);
    p = (int *) malloc(n*sizeof(int));
   
printf("Input\n");
    for(i=0;i
        scanf("%d",&p[i]);
    for(i=0;i
        printf("%d ",p[i]);
    free(p);
    scanf(" ");
    return 0;
}

ผลการรัน

 


edit @ 5 Jul 2009 21:32:18 by Mistertun

edit @ 5 Jul 2009 21:39:17 by Mistertun

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

Tweet

#1 By (118.175.22.77) on 2009-08-13 11:24