งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

Arrays and Pointers. Advanced C Arrays / ชื่อตัวแปร intA ทำหน้าที่เป็น pointer ชี้ไป ที่ตำแหน่งแรกของ array 13 intA 0 1 2 3 4 5 memory int intA[6]; intA[3]

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "Arrays and Pointers. Advanced C Arrays / ชื่อตัวแปร intA ทำหน้าที่เป็น pointer ชี้ไป ที่ตำแหน่งแรกของ array 13 intA 0 1 2 3 4 5 memory int intA[6]; intA[3]"— ใบสำเนางานนำเสนอ:

1 Arrays and Pointers

2 Advanced C Arrays / ชื่อตัวแปร intA ทำหน้าที่เป็น pointer ชี้ไป ที่ตำแหน่งแรกของ array 13 intA memory int intA[6]; intA[3] = 13;

3 Advanced C Arrays / intA + 3 หมายถึงตำแหน่งที่ 3 ถัดจาก ตำแหน่งที่ intA ชี้อยู่ memory intA + 3 นั่นคือ intA + 3 เป็น pointer ที่ชี้ไปยัง intA[3] intA

4 Advanced C Arrays ข้อสังเกต : - intA หรือ intA+3 เป็น pointer( เก็บตำแหน่ง ) แต่ intA[3] เป็น integer - intA+3 มีค่าเท่ากับ & intA[3] และ intA[3] เท่ากับ * (intA+3) ข้อสังเกต : - intA หรือ intA+3 เป็น pointer( เก็บตำแหน่ง ) แต่ intA[3] เป็น integer - intA+3 มีค่าเท่ากับ & intA[3] และ intA[3] เท่ากับ * (intA+3) memory intA + 3intA

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) ); } int intA[6], i; for(i=0;i<6;i++) {intA[i] = i*2; } for(i=0;i<6;i++) {printf(“%d ”, *(intA+i) ); } รอบที่ i = 0*(intA+0) [0][1][2][3][4][5] intA รอบที่ i = 1*(intA+1) รอบที่ i = 2*(intA+2) รอบที่ i = 3*(intA+3) รอบที่ i = 4*(intA+4) รอบที่ i = 5*(intA+5)

6 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 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

7 Tips / ฟังก์ชัน sizeof( ) เป็นฟังก์ชันบอกขนาด ของตัวแปรหรือขนาดของชนิดข้อมูล เช่น int a, b; b = sizeof(a); printf(“%d”, sizeof(float)); / ฟังก์ชัน sizeof( ) เป็นฟังก์ชันบอกขนาด ของตัวแปรหรือขนาดของชนิดข้อมูล เช่น int a, b; b = sizeof(a); printf(“%d”, sizeof(float));

8 Tips / TYPE cast คือการเปลี่ยนชนิดข้อมูล โดย การเขียนชนิดข้อมูลไว้ในวงเล็บ เช่น (int), (float), (char) แล้ววางไว้หน้าตัวแปรหรือ ค่าข้อมูลที่ต้องการเปลี่ยน ตัวอย่างเช่น float f = 10.5; printf(“%d”, (int)f); printf(“%d”, (int)5.5); / TYPE cast คือการเปลี่ยนชนิดข้อมูล โดย การเขียนชนิดข้อมูลไว้ในวงเล็บ เช่น (int), (float), (char) แล้ววางไว้หน้าตัวแปรหรือ ค่าข้อมูลที่ต้องการเปลี่ยน ตัวอย่างเช่น float f = 10.5; printf(“%d”, (int)f); printf(“%d”, (int)5.5);

9 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  เราสามารถจองเนื้อที่ในหน่วยความจำ (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

10 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); 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) ); อาจเขียนได้อีกแบบ ดังนี้ for(i=0; i < 10 ; i++) *(a+i) = i+5; for(i=0; i < 10 ; i++) printf(“%d ”, *(a+i) );

11 Bad dynamic arrays example / นี่คือตัวอย่างการใช้งานที่ไม่ควรทำ int * intPtr; int x; intPtr = &x; intPtr[0] = 12;// ok intPtr[3] = 13;// bad เพราะอะไร ??? / นี่คือตัวอย่างการใช้งานที่ไม่ควรทำ int * intPtr; int x; intPtr = &x; intPtr[0] = 12;// ok intPtr[3] = 13;// bad เพราะอะไร ???

12 Advantages of being in the heap / สามารถกำหนดขนาดของหน่วยความจำ ( เช่น array) ได้ขณะรันโปรแกรม / สามารถคืนเนื้อที่ในหน่วยความจำที่ได้มาโดยใช้ free() / สามารถเปลี่ยนแปลงขนาดของ array ขณะรัน โปรแกรมได้โดยใช้ realloc() เช่น b = realloc(b, sizeof(int)*100); ทำให้ใช้เนื้อที่ในหน่วยความจำได้อย่างมี ประสิทธิภาพมากขึ้น / สามารถกำหนดขนาดของหน่วยความจำ ( เช่น array) ได้ขณะรันโปรแกรม / สามารถคืนเนื้อที่ในหน่วยความจำที่ได้มาโดยใช้ free() / สามารถเปลี่ยนแปลงขนาดของ array ขณะรัน โปรแกรมได้โดยใช้ realloc() เช่น b = realloc(b, sizeof(int)*100); ทำให้ใช้เนื้อที่ในหน่วยความจำได้อย่างมี ประสิทธิภาพมากขึ้น

13 Disadvantages of being in the heap / ต้องจองเนื้อที่ไว้ใช้เอง และต้องจองให้ถูกต้อง ( ไม่มีใครมาเช็คให้ ) / ต้องไม่ลืมที่จะคืนหน่วยความจำ และต้องทำเอง / ถ้าลืมจอง - คืน หรือ ทำผิดขั้นตอน โปรแกรมอาจ ไม่แสดงข้อผิดพลาดขณะ compile และทำงานได้ ตามปกติ แต่เมื่อเจอ input บางกรณีอาจทำให้ โปรแกรมผิดพลาดและเสียหายได้... นั่นคือ ต้อง ใช้อย่างระมัดระวัง / ต้องจองเนื้อที่ไว้ใช้เอง และต้องจองให้ถูกต้อง ( ไม่มีใครมาเช็คให้ ) / ต้องไม่ลืมที่จะคืนหน่วยความจำ และต้องทำเอง / ถ้าลืมจอง - คืน หรือ ทำผิดขั้นตอน โปรแกรมอาจ ไม่แสดงข้อผิดพลาดขณะ compile และทำงานได้ ตามปกติ แต่เมื่อเจอ input บางกรณีอาจทำให้ โปรแกรมผิดพลาดและเสียหายได้... นั่นคือ ต้อง ใช้อย่างระมัดระวัง

14 โจทย์ 6 / เขียนโปรแกรมแปลงเลขฐานสองเป็นฐาน สิบหก โดย / 6.1 ไม่มีทศนิยม เช่น Input : Output : 8F / 6.2 มีทศนิยม เช่น Input : Output : 8F.8 / เขียนโปรแกรมแปลงเลขฐานสองเป็นฐาน สิบหก โดย / 6.1 ไม่มีทศนิยม เช่น Input : Output : 8F / 6.2 มีทศนิยม เช่น Input : Output : 8F.8


ดาวน์โหลด ppt Arrays and Pointers. Advanced C Arrays / ชื่อตัวแปร intA ทำหน้าที่เป็น pointer ชี้ไป ที่ตำแหน่งแรกของ array 13 intA 0 1 2 3 4 5 memory int intA[6]; intA[3]

งานนำเสนอที่คล้ายกัน


Ads by Google