SlideServe
Menu
Préférences
© SlideServe · v2026

Mastering Advanced C Arrays and Pointers

tal avatar
13 diapositives · 231 Views · Oct 03, 2014

Learn how to manipulate arrays and pointers in advanced C programming. Understand memory allocation, dynamic arrays, and pointer types for efficient coding. Dive deep into pointer arithmetic and heap memory management.

Mastering Advanced C Arrays and Pointers - slide 1
01 / 13Mastering Advanced C Arrays and Pointers
1 / 17

Télécharger la présentation

Mastering Advanced C Arrays and Pointers
Une image / un lien ci-dessous est fourni (tel quel) pour télécharger la présentation

Politique de téléchargement : le contenu du site vous est fourni TEL QUEL pour votre information et votre usage personnel ; il ne peut être vendu, concédé sous licence ni partagé sur d’autres sites sans l’accord de son auteur.Le contenu vous est fourni TEL QUEL, pour votre information et votre usage personnel uniquement. Téléchargez la présentation en cliquant sur ce lien. Lors du téléchargement, si vous ne parvenez pas à télécharger une présentation, l’éditeur a peut-être supprimé le fichier de son serveur.Pendant le téléchargement, si vous ne parvenez pas à obtenir une présentation, le fichier a peut-être été supprimé par l’éditeur.

F I N

Plus de contenu associé

Transcription de la présentation
  1. Arrays and Pointers

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

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

  4. 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

  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)

  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

  7. Tips • ฟังก์ชัน 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);

  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

  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); อาจเขียนได้อีกแบบ ดังนี้ 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 = &i; intPtr[0] = 12; // ok intPtr[3] = 13; // bad เพราะอะไร???

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

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