Arrays and Pointers
description
Transcript of Arrays and Pointers
Arrays and PointersArrays and Pointers
Advanced C ArraysAdvanced C Arrays
ชื่��อตั�วแปร intA ทำ �หน้��ทำ��เป�น้ pointer ชื่��ไปทำ��ตั �แหน้�งแรกของ array
ชื่��อตั�วแปร intA ทำ �หน้��ทำ��เป�น้ pointer ชื่��ไปทำ��ตั �แหน้�งแรกของ array
13
intA
0 1 2 3 4 5
memory
int intA[6];
intA[3] = 13;
Advanced C ArraysAdvanced C Arrays
intA + 3 หม�ยถึ�งตั �แหน้�งทำ�� 3 ถึ�ดจ�กตั �แหน้�งทำ�� intA ชื่��อย!�
intA + 3 หม�ยถึ�งตั �แหน้�งทำ�� 3 ถึ�ดจ�กตั �แหน้�งทำ�� intA ชื่��อย!�
130 1 2 3 4 5
memory
intA + 3
นั่��นั่คื�อ intA + 3 เป็นั่ pointer ที่��ชี้��ไป็ยั�ง intA[3]intA
Advanced C ArraysAdvanced 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)
130 1 2 3 4 5
memory
intA + 3
intA
ExampleExample
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 2 4 6 8 10
[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)
Pointer Type EffectsPointer 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
TipsTips
ฟั)งก*ชื่�น้ sizeof( ) เป�น้ฟั)งก*ชื่�น้บอกขน้�ดของตั�วแปรหร�อขน้�ดของชื่น้+ดข�อม!ลเชื่�น้
int a, b;b = sizeof(a);printf(“%d”, sizeof(float));
ฟั)งก*ชื่�น้ sizeof( ) เป�น้ฟั)งก*ชื่�น้บอกขน้�ดของตั�วแปรหร�อขน้�ดของชื่น้+ดข�อม!ลเชื่�น้
int a, b;b = sizeof(a);printf(“%d”, sizeof(float));
TipsTips
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);
Dynamic arraysDynamic arrays เร�สั�ม�รถึจองเน้��อทำ��ใน้หน้�วยค่ว�มจ � (heap memory) โดยใชื่�ฟั)งก*ชื่�น้
malloc() (อย!�ใน้ header file ทำ��ชื่��อว�� stdlib.h)malloc( size of memory in bytes);
เชื่�น้ malloc(12); จองเน้��อทำ��ใน้หน้�วยค่ว�มจ �ขน้�ด 12 bytesmalloc(sizeof(float)); จองเน้��อทำ��ใน้หน้�วยค่ว�มจ �ขน้�ดเทำ��ก�บ 4
bytesmalloc(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 bytesmalloc(sizeof(float)); จองเน้��อทำ��ใน้หน้�วยค่ว�มจ �ขน้�ดเทำ��ก�บ 4
bytesmalloc(sizeof(int)*3); จองเน้��อทำ��ใน้หน้�วยค่ว�มจ �ขน้�ดเทำ��ก�บ
ขน้�ดของ integer * 3 = 2 * 3 bytes = 6 bytes
Dynamic arraysDynamic 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) );
Bad dynamic arrays exampleBad dynamic arrays example
น้��ค่�อตั�วอย��งก�รใชื่�ง�น้ทำ��ไม�ค่วรทำ �
int * intPtr;int x;
intPtr = &i;intPtr[0] = 12; // okintPtr[3] = 13; // bad
เพร�ะอะไร???
น้��ค่�อตั�วอย��งก�รใชื่�ง�น้ทำ��ไม�ค่วรทำ �
int * intPtr;int x;
intPtr = &i;intPtr[0] = 12; // okintPtr[3] = 13; // bad
เพร�ะอะไร???
Advantages of being in the heapAdvantages 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);
ทำ �ให�ใชื่�เน้��อทำ��ใน้หน้�วยค่ว�มจ �ได�อย��งม�ประสั+ทำธิ+ภ�พม�กข��น้
Disadvantages of being in the heap
Disadvantages of being in the heap
ตั�องจองเน้��อทำ��ไว�ใชื่�เอง และตั�องจองให�ถึ!กตั�อง (ไม�ม�ใค่รม�เชื่#ค่ให�)
ตั�องไม�ล�มทำ��จะค่�น้หน้�วยค่ว�มจ � และตั�องทำ �เอง ถึ��ล�มจอง-ค่�น้ หร�อ ทำ �ผิ+ดข��น้ตัอน้ โปรแกรมอ�จไม�
แสัดงข�อผิ+ดพล�ดขณะ compile และทำ �ง�น้ได�ตั�มปกตั+ แตั�เม��อเจอ input บ�งกรณ�อ�จทำ �ให�โปรแกรมผิ+ดพล�ดและเสั�ยห�ยได� ... น้��น้ค่�อ ตั�องใชื่�อย��งระม�ดระว�ง
ตั�องจองเน้��อทำ��ไว�ใชื่�เอง และตั�องจองให�ถึ!กตั�อง (ไม�ม�ใค่รม�เชื่#ค่ให�)
ตั�องไม�ล�มทำ��จะค่�น้หน้�วยค่ว�มจ � และตั�องทำ �เอง ถึ��ล�มจอง-ค่�น้ หร�อ ทำ �ผิ+ดข��น้ตัอน้ โปรแกรมอ�จไม�
แสัดงข�อผิ+ดพล�ดขณะ compile และทำ �ง�น้ได�ตั�มปกตั+ แตั�เม��อเจอ input บ�งกรณ�อ�จทำ �ให�โปรแกรมผิ+ดพล�ดและเสั�ยห�ยได� ... น้��น้ค่�อ ตั�องใชื่�อย��งระม�ดระว�ง