Arrays and Pointers

13
Arrays and Pointers

description

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. - PowerPoint PPT Presentation

Transcript of Arrays and Pointers

Page 1: Arrays  and  Pointers

Arrays and PointersArrays and Pointers

Page 2: Arrays  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;

Page 3: Arrays  and  Pointers

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

Page 4: Arrays  and  Pointers

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

Page 5: Arrays  and  Pointers

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)

Page 6: Arrays  and  Pointers

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

Page 7: Arrays  and  Pointers

TipsTips

ฟั)งก*ชื่�น้ sizeof( ) เป�น้ฟั)งก*ชื่�น้บอกขน้�ดของตั�วแปรหร�อขน้�ดของชื่น้+ดข�อม!ลเชื่�น้

int a, b;b = sizeof(a);printf(“%d”, sizeof(float));

ฟั)งก*ชื่�น้ sizeof( ) เป�น้ฟั)งก*ชื่�น้บอกขน้�ดของตั�วแปรหร�อขน้�ดของชื่น้+ดข�อม!ลเชื่�น้

int a, b;b = sizeof(a);printf(“%d”, sizeof(float));

Page 8: Arrays  and  Pointers

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);

Page 9: Arrays  and  Pointers

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

Page 10: Arrays  and  Pointers

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) );

Page 11: Arrays  and  Pointers

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

เพร�ะอะไร???

Page 12: Arrays  and  Pointers

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);

ทำ �ให�ใชื่�เน้��อทำ��ใน้หน้�วยค่ว�มจ �ได�อย��งม�ประสั+ทำธิ+ภ�พม�กข��น้

Page 13: Arrays  and  Pointers

Disadvantages of being in the heap

Disadvantages of being in the heap

ตั�องจองเน้��อทำ��ไว�ใชื่�เอง และตั�องจองให�ถึ!กตั�อง (ไม�ม�ใค่รม�เชื่#ค่ให�)

ตั�องไม�ล�มทำ��จะค่�น้หน้�วยค่ว�มจ � และตั�องทำ �เอง ถึ��ล�มจอง-ค่�น้ หร�อ ทำ �ผิ+ดข��น้ตัอน้ โปรแกรมอ�จไม�

แสัดงข�อผิ+ดพล�ดขณะ compile และทำ �ง�น้ได�ตั�มปกตั+ แตั�เม��อเจอ input บ�งกรณ�อ�จทำ �ให�โปรแกรมผิ+ดพล�ดและเสั�ยห�ยได� ... น้��น้ค่�อ ตั�องใชื่�อย��งระม�ดระว�ง

ตั�องจองเน้��อทำ��ไว�ใชื่�เอง และตั�องจองให�ถึ!กตั�อง (ไม�ม�ใค่รม�เชื่#ค่ให�)

ตั�องไม�ล�มทำ��จะค่�น้หน้�วยค่ว�มจ � และตั�องทำ �เอง ถึ��ล�มจอง-ค่�น้ หร�อ ทำ �ผิ+ดข��น้ตัอน้ โปรแกรมอ�จไม�

แสัดงข�อผิ+ดพล�ดขณะ compile และทำ �ง�น้ได�ตั�มปกตั+ แตั�เม��อเจอ input บ�งกรณ�อ�จทำ �ให�โปรแกรมผิ+ดพล�ดและเสั�ยห�ยได� ... น้��น้ค่�อ ตั�องใชื่�อย��งระม�ดระว�ง