130 likes | 217 Views
Arrays and Pointers. Advanced C Arrays. ชื่อตัวแปร intA ทำหน้าที่เป็น pointer ชี้ไปที่ตำแหน่งแรกของ array. int intA[6]; intA[3] = 13;. intA. memory. 0 1 2 3 4 5. intA. intA + 3. Advanced C Arrays.
E N D
Advanced C Arrays • ชื่อตัวแปร intA ทำหน้าที่เป็น pointerชี้ไปที่ตำแหน่งแรกของ array int intA[6]; intA[3] = 13; intA memory 0 1 2 3 4 5
intA intA + 3 Advanced C Arrays • intA + 3 หมายถึงตำแหน่งที่ 3 ถัดจากตำแหน่งที่ intA ชี้อยู่ นั่นคือ intA + 3 เป็น pointer ที่ชี้ไปยัง intA[3] memory 0 1 2 3 4 5
intA Advanced C Arrays ข้อสังเกต : - intA หรือ intA+3 เป็น pointer(เก็บตำแหน่ง) แต่ intA[3] เป็น integer - intA+3 มีค่าเท่ากับ &intA[3]และ intA[3] เท่ากับ *(intA+3) intA + 3 memory 0 1 2 3 4 5
Example int intA[6], i; for(i=0;i<6;i++) { intA[i] = i*2; } for(i=0;i<6;i++) { printf(“%d ”, *(intA+i) ); } intA รอบที่ i = 0 *(intA+0) รอบที่ i = 1 *(intA+1) รอบที่ i = 2 *(intA+2) รอบที่ i = 3 *(intA+3) รอบที่ i = 4 *(intA+4) รอบที่ i = 5 *(intA+5)
Pointer Type Effects int *p; p = p + 12; จากตัวอย่างข้างบน p = p+12 ไม่ได้เป็นการบวก 12 กับค่าที่อยู่ใน p แต่... p = p+12 จะเพิ่มค่า p ขึ้นเท่ากับขนาดของ integer 12 ตัว (มาจากการประกาศให้ p เป็น pointer ที่ชี้ไปยัง int ) ดังนั้น ถ้า integer 1 ตัว = 2 bytes จะได้ว่า p = p+12 จะหมายถึงเพิ่มค่า p ขึ้นอีก 24
Tips • ฟังก์ชัน sizeof( ) เป็นฟังก์ชันบอกขนาดของตัวแปรหรือขนาดของชนิดข้อมูล เช่น int a, b; b = sizeof(a); printf(“%d”, sizeof(float));
Tips • TYPE cast คือการเปลี่ยนชนิดข้อมูล โดยการเขียนชนิดข้อมูลไว้ในวงเล็บ เช่น (int), (float), (char) แล้ววางไว้หน้าตัวแปรหรือค่าข้อมูลที่ต้องการเปลี่ยน ตัวอย่างเช่น float f = 10.5; printf(“%d”, (int)f); printf(“%d”, (int)5.5);
Dynamic arrays • เราสามารถจองเนื้อที่ในหน่วยความจำ (heap memory) โดยใช้ฟังก์ชัน malloc() (อยู่ใน header fileที่ชื่อว่า stdlib.h) malloc( size of memory in bytes); เช่น malloc(12); จองเนื้อที่ในหน่วยความจำขนาด 12 bytes malloc(sizeof(float)); จองเนื้อที่ในหน่วยความจำขนาดเท่ากับ 4 bytes malloc(sizeof(int)*3); จองเนื้อที่ในหน่วยความจำขนาดเท่ากับ ขนาดของ integer * 3 = 2 * 3 bytes = 6 bytes
Dynamic arrays int *a, i; a = (int *)malloc( sizeof(int) * 10 ); assert (a != NULL); for(i=0; i < 10 ; i++) a[i] = i+5; for(i=0; i < 10 ; i++) printf(“%d ”, a[i]); free(a); อาจเขียนได้อีกแบบ ดังนี้ for(i=0; i < 10 ; i++) *(a+i) = i+5; for(i=0; i < 10 ; i++) printf(“%d ”, *(a+i) );
Bad dynamic arrays example • นี่คือตัวอย่างการใช้งานที่ไม่ควรทำ int * intPtr; int x; intPtr = &i; intPtr[0] = 12; // ok intPtr[3] = 13; // bad เพราะอะไร???
Advantagesof being in the heap • สามารถกำหนดขนาดของหน่วยความจำ(เช่น array) ได้ขณะรันโปรแกรม • สามารถคืนเนื้อที่ในหน่วยความจำที่ได้มาโดยใช้ free() • สามารถเปลี่ยนแปลงขนาดของ array ขณะรันโปรแกรมได้โดยใช้ realloc() เช่น b = realloc(b, sizeof(int)*100); ทำให้ใช้เนื้อที่ในหน่วยความจำได้อย่างมีประสิทธิภาพมากขึ้น
Disadvantages of being in the heap • ต้องจองเนื้อที่ไว้ใช้เอง และต้องจองให้ถูกต้อง (ไม่มีใครมาเช็คให้) • ต้องไม่ลืมที่จะคืนหน่วยความจำ และต้องทำเอง • ถ้าลืมจอง-คืน หรือ ทำผิดขั้นตอน โปรแกรมอาจไม่แสดงข้อผิดพลาดขณะ compile และทำงานได้ตามปกติ แต่เมื่อเจอ input บางกรณีอาจทำให้โปรแกรมผิดพลาดและเสียหายได้ ... นั่นคือ ต้องใช้อย่างระมัดระวัง