ตัวชี้และอาร์เรย์ (pointer and array)

68
ตตตตตตตตตตตตตตตตต (Pointer and Array)

Upload: michi

Post on 19-Jan-2016

50 views

Category:

Documents


0 download

DESCRIPTION

ตัวชี้และอาร์เรย์ (Pointer and Array). i = 10;. 10. int i;. i. i. 400. 400. 402. 402. 404. 404. 6.1 ตัวชี้กับแอดเดรส (Pointers and Address). int i; i = 10;. รูปที่ 6.1 แสดงการแทนข้อมูลในหน่วยความจำของตัวแปรประเภทพื้นฐาน. p. i. p. p. 400. 360. i. 10. 10. i. 10. 400. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ตั�วชี้��และอาร์ เร์ย์ (Pointer and Array)

Page 2: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ร์�ปที่�� 61. แสดงการ์แที่นข้�อมู�ลในหน�วย์ความูจำ"าข้องตั�วแปร์ปร์ะเภที่พื้%�น

ฐาน

int i;

i 400402404

i = 10;

i 400402404

10

int i;i = 10;

61. ตั�วชี้��ก�บแอดเดร์ส (Pointers and Address)

Page 3: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

p

i

360

400

400

10

p

i10

p

i10

ร์�ปที่�� 62 แสดงการ์แที่นข้�อมู�ลในหน�วย์ความูจำ"าข้องตั�วแปร์ปร์ะเภที่ตั�วชี้��

Page 4: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

62. การ์ปร์ะกาศตั�วแปร์ปร์ะเภที่ตั�วชี้��

การ์ปร์ะกาศตั�วแปร์ปร์ะเภที่พื้อย์น เตัอร์ จำะใชี้� Unary Operator * * ซึ่*�งมู�ชี้%�อเร์�ย์กว�า Indirection หร์%อ Dereferencing Operator โดย์จำะตั�องปร์ะกาศปร์ะเภที่ข้องตั�วแปร์พื้อย์น เตัอร์ ให�สอดคล�องก�บปร์ะเภที่ข้องตั�วแปร์ที่��เร์าตั�องการ์ (ย์กเว�นตั�วแปร์พื้อย์น เตัอร์ ปร์ะเภที่ void ที่��สามูาร์ถชี้��ไปย์�งตั�วแปร์ปร์ะเภที่ใดก.ได� )

Page 5: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

int *ip;

เป/นการ์ปร์ะกาศตั�วแปร์ ip ให�เป/นตั�วแปร์พื้อย์น เตัอร์ ที่��ชี้��ไปย์�งตั�วแปร์ปร์ะเภที่ int

double *dp, atof(char *);

เป/นการ์ปร์ะกาศตั�วแปร์ dp เป/นตั�วแปร์พื้อย์น เตัอร์ ที่��ชี้��ไปย์�งตั�วแปร์ปร์ะเภที่ double และปร์ะกาศฟั1งก ชี้�น atof มู�พื้าร์ามู2เตัอร์ เป/นตั�วแปร์พื้อย์น เตัอร์ ปร์ะเภที่ char

ตั�วอย์�าง

Page 6: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

63 การ์ก"าหนดค�าและการ์อ�านค�าตั�วแปร์ปร์ะเภที่ตั�วชี้��

การ์ก"าหนดค�าให�ก�บตั�วแปร์พื้อย์น เตัอร์ จำะเป/นการ์ก"าหนดแอดเดร์สข้องตั�วแปร์ที่��มู�ปร์ะเภที่สอดคล�องก�บปร์ะเภที่ข้องตั�วแปร์พื้อย์น เตัอร์ เที่�าน��น โดย์การ์ใชี้� Unary

Operator && เป/นโอเปอเร์เตัอร์ ที่��อ�างถ*งแอดเดร์สข้องออปเจำ.ค (Object) ใด ๆ

Page 7: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

int x = 1, y = 2;int *ip, *iq;ip = &x;y = *ip;*ip = 0;y = 5;ip = &y;*ip = 3;iq = ip;

ร์�ปที่�� 63. แสดงการ์ก"าหนดค�าและการ์อ�านค�าตั�วแปร์ตั�วชี้��

Page 8: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

400

500

402

502

x

ip

y

iq

1

2 int x = 1, y = 2;int *ip, *iq;

Page 9: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

x

ip

400

500

y 402

502iq

1

2

400

ip = &x;

Page 10: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

x

ip

400

500

y 402

502iq

1

1

400

y = *ip;

Page 11: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

x

ip

400

500

y 402

502

iq

0

1

400

*ip = 0;

Page 12: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

x

ip

400

500

y 402

502iq

0

5

400

y = 5;

Page 13: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

x

ip

400

500

y 402

502iq

0

5

402

ip = &y;

Page 14: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

x

ip

400

500

y 402

502iq

0

3

402

*ip = 3;

Page 15: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

x

ip

400

500

y 402

402 502iq

0

3

402

iq = ip;

Page 16: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

64 ตั�วชี้��และอาร์ ก2วเมูนที่ ข้องฟั1งก ชี้�น(Pointer and Function

Arguments) เน%�องจำากภาษาซึ่�มู�การ์ส�งอาก2วเมูนตั ให�ก�บฟั1งก ชี้�นแบบ By Value และฟั1งก ชี้�นสามูาร์ถค%นค�า (return) ค�าได�เพื้�ย์งหน*�งค�า หากตั�องการ์ให�ฟั1งก ชี้�นมู�การ์เปล��ย์นแปลงค�าและค%นค�ากล�บมูาย์�งฟั1งก ชี้�นที่��เร์�ย์กใชี้�มูากกว�าหน*�งค�าจำะตั�องน"าพื้อย์น เตัอร์ เข้�ามูาชี้�วย์

Page 17: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ตั�วอย์�างเชี้�น หากตั�องการ์เข้�ย์นฟั1งก ชี้�นเพื้%�อสล�บค�าข้องตั�วแปร์ 2 ตั�ว ผลล�พื้ธ์ ที่��ตั�องการ์ได�จำากฟั1งก ชี้�นน��จำะมู�

2 ค�าข้องตั�วแปร์ที่��ที่"าการ์สล�บค�า หากอาร์ ก2วเมูนตั เป/นตั�วแปร์ธ์ร์ร์มูดาจำะไมู�สามูาร์ถแก�ป1ญหาน��ได� จำ*งตั�องใชี้�พื้อย์น เตัอร์ เข้�ามูาชี้�วย์ โดย์การ์ส�งค�าแอดเดร์สข้องตั�วแปร์ที่��ง 2 ให�ก�บฟั1งก ชี้�นที่��จำะสล�บค�าข้องตั�วแปร์ที่��ง 2 ผ�านที่างตั�วแปร์พื้อย์น เตัอร์ ที่��เป/นอาร์ ก2วเมูนตั ข้องฟั1งก ชี้�น

Page 18: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ตั�วอย์�าง61.

โปร์แกร์มูตั�วอย์�างการ์สล�บค�าตั�วแปร์ 2 ตั�วโดย์ผ�านฟั1งก ชี้�น จำะแสดงการ์ส�งอาร์ ก2วเมูนตั ในเป/นพื้อย์น เตัอร์ #include

<stdio.h>void swap (int *, int *);

Page 19: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

void main ( ) { int x = 5, y = 10; printf(“Before swap : x = %d”, x, “,

y = %d\n”, y); swap ( &x, &y); printf(“After swap : x = %d”, x, “,

y = %d\n”, y);}

ตั�วอย์�าง 6 1. (ตั�อ)

Page 20: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

void swap (int *px, int *py) { int temp; temp = *px;

*px = *py; *py = temp;}

ตั�วอย์�าง 6 1. (ตั�อ)

Page 21: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

อาร์ ก2วเมูนที่ ที่��เป/นปร์ะเภที่พื้อย์น เตัอร์ จำะชี้�วย์ให�ฟั1งก ชี้�นสามูาร์ถเปล��ย์นค�าให�ก�บตั�วแปร์ที่��ส�งเข้�ามูาได� เน%�องจำากอาร์ ก2วเมูนที่ น��นจำะเก.บแอดเดร์สข้องตั�วแปร์ที่��ส�งเข้�ามูา เมู%�อมู�การ์เปล��ย์นแปลงค�าข้องอาร์ ก2วเมูนที่ ผ�าน Dereferencing Operator ( * ) ค�าข้องตั�วแปร์ที่��ส�งเข้�ามูาจำะถ�กเปล��ย์นค�าพื้ร์�อมูก�นในที่�นที่�

Page 22: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ร์�ปที่�� 64. แสดงความูส�มูพื้�นธ์ ข้องการ์ส�งอาร์ ก2วเมูนที่ แบบพื้อย์น เตัอร์ ก�บ

ฟั1งก ชี้�น

xy

in main ( )

pxpy

in swap ( )

Page 23: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

65 ตั�วชี้��ก�บอาร์ เร์ย์ (Pointer and Arrays)

อาร์ เร์ย์ เป/นปร์ะเภที่ข้�อมู�ลที่��เก.บชี้8ดข้องข้�อมู�ลปร์ะเภที่เด�ย์วก�น มู�กใชี้�ก�บการ์ที่"างานที่��ตั�องที่"างานก�บตั�วแปร์ชี้น2ดเด�ย์วก�นหลาย์ตั�วที่��มู�การ์ที่"างานเหมู%อนก�น เชี้�น คะแนนข้องน�กศ*กษาภาย์ในห�อง 20 คน เป/นตั�น อาร์ เร์ย์ ในภาษาซึ่�จำะน"าหล�กการ์ข้องพื้อย์น เตัอร์ เข้�ามูาใชี้� การ์ที่"างานใด ๆ ข้องอาร์ เร์ย์ สามูาร์ถใชี้�พื้อย์น เตัอร์ เข้�ามูาแที่นที่��

Page 24: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

int table[10];เป/นการ์ก"าหนดอาร์ เร์ย์ ชี้%�อ table

เป/นอาร์ เร์ย์ ปร์ะเภที่ int ที่��มู�สมูาชี้2กที่��งหมูด 10 ตั�ว ตั��งแตั� table[0], table[1], table[2], ... , table[9] สมูาชี้2กภาย์ในอาร์ เร์ย์ จำะเร์2�มูที่�� 0 เสมูอ และสมูาชี้2กตั�วส8ดที่�าย์จำะอย์��ที่��ตั"าแหน�งข้องข้นาดที่��ปร์ะกาศไว�ลบด�วย์ 1

การ์ปร์ะกาศอาร์ เร์ย์ การ์ปร์ะกาศอาร์ เร์ย์

Page 25: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ร์�ปที่�� 65. แสดงภาพื้จำ"าลองข้อง อาร์ เร์ย์ ข้นาดสมูาชี้2ก 10 ตั�ว

table[0]

table[1]

table[2]

table[9]

table

Page 26: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

จำะใชี้�ร์ะบบด�ชี้น�โดย์ผ�านเคร์%�องหมูาย์ [ ] เชี้�น อ�างถ*งสมูาชี้2กตั�วที่�� 2 ข้องอาร์ เร์ย์ ด�วย์ table[2] เป/นตั�น การ์ใชี้�งานสมูาชี้2กข้องอาร์ เร์ย์ สามูาร์ถใชี้�งานได�เหมู%อนตั�วแปร์พื้%�นฐานที่��วไป

การ์อ�างถ*งสมูาชี้2กการ์อ�างถ*งสมูาชี้2กในอาร์ เร์ย์ ในอาร์ เร์ย์

Page 27: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

sumThird = table[0] + table[1] + table[2];table[0] = 5;if ( a[0] > a[9] )

printf (“First is greater than last\n” );

ตั�วอย์�าง

Page 28: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

เร์าสามูาร์ถอ�างถ*งสมูาชี้2กที่8กตั�วภาย์ในอาร์ เร์ย์ อย์�างอ2สร์ะ ภาย์ในข้อบเข้ตัข้องข้นาดที่��ได�ปร์ะกาศอาร์ เร์ย์ ไว� แตั�การ์ใชี้�อาร์ เร์ย์ มู�กจำะเป/นการ์เข้�าถ*งสมูาชี้2กในล�กษณะที่��วไปโดย์ใชี้�ตั�วแปร์ปร์ะเภที่ int มูาชี้�วย์

Page 29: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

สมูมูตั2ให� i, j, k เป/นตั�วแปร์ปร์ะเภที่ int

for (int k = 0; k < 9; k++)

printf (“Value at %d = %d\n”, k+1, table[k]);table[i + j] = 0;table[7 – table[j]] = j;

ตั�วอย์�าง

Page 30: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ในภาษาซึ่�จำะไมู�มู�การ์ก"าหนดให�ตัร์วจำสอบข้อบเข้ตัข้องอาร์ เร์ย์ โปร์แกร์มูเมูอร์ จำะตั�องพื้ย์าย์ามูเข้�ย์นโปร์แกร์มูที่��เก��ย์วข้�องก�บสมูาชี้2กข้องอาร์ เร์ย์ ภาย์ในข้อบเข้ตัที่��ปร์ะกาศอาร์ เร์ย์ ไว� หากมู�การ์อ�างอ2งถ*งสมูาชี้2กอาร์ เร์ย์ นอกข้อบเข้ตัที่��ได�ร์ะบ8ไว� เชี้�น table[12] ส2�งที่��ได�ค%อการ์ไปอ�านข้�อมู�ลในพื้%�นที่��ข้องหน�วย์ความูจำ"าที่��อาจำจำะเก.บค�าข้องตั�วแปร์ตั�วอ%�น หร์%อค�าอ%�นใดที่��ไมู�อาจำคาดเดาได�

ส2�งที่��ตั�องร์ะว�ง

Page 31: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ตั�วอย์�าง62.

ให�อ�านค�าข้องจำ"านวนเตั.มู 5จำ"านวนจำากค�ย์ บอร์ ด และแสดงผลในล"าด�บที่��กล�บก�น# include <stdio.h>

#define SIZE 5main ( ) { int k; int table[SIZE];

for (k = 0; k < SIZE; k++) scanf (“%d”, &table[k]); for (k = SIZE; k >= 0; k++) printf (“%d\n”, table[k]); }

Page 32: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

สมูาชี้2กข้องอาร์ เร์ย์ อาจำเป/นปร์ะเภที่ข้�อมู�ลพื้%�นฐานใด ๆ ก.ได� หร์%ออาจำเป/นข้�อมู�ลปร์ะเภที่ Enumeration เชี้�น

#define TSIZE 10#define NAMESIZE 20#define ADDRSIZE 30enum month { JAN, FEB,

MAR, APR, MAY, JUN, JUL, AUG,

SEP, OCT, NOV, DEC }

Page 33: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

typedef enum month Month;

int age[TSIZE];float size[TSIZE+1];Month date[8 ];char name[NAMESIZE],

address[ADDRSIZE];

Page 34: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

66. การ์ใชี้�ตั�วชี้��ก�บอาร์ เร์ย์ การ์ที่"างานใด ๆ ข้องอาร์ เร์ย์ สามูาร์ถใชี้�พื้อย์น เตัอร์ เข้�ามูาชี้�วย์ ซึ่*�งจำะที่"าให�มู�ความูเร์.วในการ์ที่"างานส�งข้*�น สมูมูตั2ว�ามู�อาร์ เร์ย์ a และพื้อย์น เตัอร์ pa ด�งน��

int a[10];int *pa;

ก"าหนดให�พื้อย์น เตัอร์ pa ชี้��ไปย์�งอาร์ เร์ย์ a ด�วย์ค"าส��ง

pa = &a[0]; /* หร์%อใชี้�ค"าส��ง pa = a; */pa จำะเก.บค�าแอดเดร์สเร์2�มูตั�นข้องอาร์ เร์ย์ a

Page 35: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ร์�ปที่�� 66. แสดงตั�วชี้��ชี้��ไปย์�งแอดเดร์สเร์2�มูตั�นข้องอาร์ เร์ย์

a[0]

a[1]

a[2]

a[9]

a

pa

Page 36: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

การ์น"าไปใชี้�งานจำะสามูาร์ถอ�านค�าอาร์ เร์ย์ ผ�านพื้อย์น เตัอร์ ได�ด�งน��

x = *pa;จำะเป/นการ์ก"าหนดค�าให� x มู�ค�าเที่�าก�บ a[0] การ์เล%�อนไปอ�านค�าสมูาชี้2กตั"าแหน�งตั�าง ๆ ข้องอาร์ เร์ย์ ผ�านที่างพื้อย์น เตัอร์ สามูาร์ถที่"าได�โดย์การ์เพื้2�มูค�าพื้อย์น เตัอร์ ข้*�น 1 เพื้%�อเล%�อนไปย์�งตั"าแหน�งถ�ดไป หร์%อเพื้2�มูค�าข้*�น N เพื้%�อเล%�อนไป N ตั"าแหน�ง หร์%ออาจำจำะลดค�าเพื้%�อเล%�อนตั"าแหน�งลง

Page 37: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

กร์ณ�ที่�� pa ชี้��อย์��ที่�� a[0] ค"าส��งpa+1;

จำะเป/นการ์อ�างถ*งแอดเดร์สข้อง a[1] หากเป/น pa+i เป/นการ์อ�างถ*งแอดเดร์ส a[i] หากตั�องการ์อ�างถ*งข้�อมู�ลภาย์ในข้องสมูาชี้2กข้องอาร์ เร์ย์ ตั"าแหน�งที่�� a[i] จำะใชี้� *(pa+i)

Page 38: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ร์�ปที่�� 67 แสดงการ์อ�างถ*งตั"าแหน�งในอาร์ เร์ย์ ผ�านตั�วชี้��

a[0]

a[1]

a[2]

a[9]

a

pa

pa+1

pa+2

Page 39: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

การ์ส��งให�บวก 1 หร์%อบวก i หร์%อ ลบ i เป/นเหมู%อนการ์เล%�อนไปย์�งสมูาชี้2กข้องอาร์ เร์ย์ ตั"าแหน�งที่��ตั�องการ์ เน%�องจำากปร์ะเภที่ข้องข้�อมู�ลแตั�ละปร์ะเภที่ข้องอาร์ เร์ย์ เชี้�น int, float, double และอ%�น ๆ มู�ข้นาดข้องข้�อมู�ลที่��ตั�างก�น ที่"าให�ข้นาดข้องสมูาชี้2กภาย์ในอาร์ เร์ย์ แตั�ละปร์ะเภที่มู�ข้นาดแตักตั�างก�นด�วย์ การ์ส��งให�บวกหร์%อลบด�วย์จำ"านวนที่��ตั�องการ์น��นจำะมู�กลไกที่��ที่"าหน�าที่��ค"านวณตั"าแหน�งที่��ตั�องการ์ให�สอดคล�อง ก�บข้�อมู�ลแตั�ละปร์ะเภที่โดย์อ�ตัโนมู�ตั2

Page 40: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

นอกจำากน��ย์�งสามูาร์ถใชี้�พื้อย์น เตัอร์ แที่นอาร์ เร์ย์ การ์อ�างโดย์ใชี้� a[i] สามูาร์ถใชี้� *(a+i) เน%�องจำากที่8กคร์��งที่��อ�างถ*ง a[i] ภาษาซึ่�จำะที่"าหน�าที่��แปลงเป/น *(a+i) เพื้ร์าะฉะน��นการ์เข้�ย์นในร์�ปแบบใดก.ให�ผลล�พื้ธ์ ในการ์ที่"างานเชี้�นเด�ย์วก�น และการ์อ�างถ*งแอดเดร์ส เชี้�น &a[i] จำะมู�ผลเที่�าก�บการ์ใชี้� a+i

Page 41: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ในล�กษณะเด�ย์วก�นการ์ใชี้�งานพื้อย์น เตัอร์ ก.สามูาร์ถใชี้�ค"าส��งในล�กษณะอาร์ เร์ย์ ก.ได� เชี้�น การ์อ�างถ*ง *(pa+i) สามูาร์ถเข้�ย์นด�วย์ pa[i] ก.ได�ผลเชี้�นเด�ย์วก�น

ส2�งที่��แตักตั�างก�นข้องอาร์ เร์ย์ และพื้อย์น เตัอร์ ค%อ พื้อย์น เตัอร์ เป/นตั�วแปร์ แตั�อาร์ เร์ย์ ไมู�ใชี้�ตั�วแปร์ สมูมูตั2ให� a เป/นอาร์ เร์ย์ และ pa เป/นพื้อย์น เตัอร์ การ์อ�างถ*ง pa = a หร์%อ pa++ จำะสามูาร์ถคอมูไพื้ล ได� แตั�จำะไมู�สามูาร์ถใชี้�ค"าส��ง a = pa หร์%อ a++ ได�

Page 42: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

เมู%�อมู�การ์ส�งชี้%�อข้องอาร์ เร์ย์ ให�แก�ฟั1งก ชี้�น จำะเป/นการ์ส�งตั"าแหน�งแอดเดร์สข้องสมูาชี้2กตั�วแร์กข้องอาร์ เร์ย์ ให�แก�ฟั1งก ชี้�น ด�งน��นพื้าร์ามู2เตัอร์ ในฟั1งก ชี้�นน��นจำะเป/นตั�วแปร์ปร์ะเภที่พื้อย์น เตัอร์

Page 43: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ตั�วอย์�าง63.

ฟั1งก ชี้�นที่��ร์�บพื้าร์ามู2เตัอร์ เป/นพื้อย์น เตัอร์ โดย์อาร์ ก2วเมูนที่ ที่��ส�งมูาเป/นอาร์ เร์ย์

int strlen (char *s) { int n; for ( n = 0; *s != ‘\0’; s++ ) n++; return n;}

Page 44: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

จำะเห.นว�า s เป/นพื้อย์น เตัอร์ ในฟั1งก ชี้�นจำะมู�การ์ตัร์วจำสอบข้�อมู�ลว�ามู�ค�าเที่�าก�บ ‘\0’ หร์%อไมู� และมู�การ์เล%�อนตั"าแหน�งที่�ละ 1 ค�า (น�บว�าข้�อมู�ลมู�ความูย์าวเพื้2�มูข้*�นที่�ละ 1 โดย์ใชี้� s++ การ์เร์�ย์กใชี้�ฟั1งก ชี้�น strlen สามูาร์ถที่"าได�หลาย์ล�กษณะ

strlen (“hello world”);/* string constant */

strlen (array); /* char array[10] */

strlen (ptr); /* char *ptr; */

Page 45: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

นอกจำากน��ย์�งอาจำจำะปร์ะกาศพื้าร์ามู2เตัอร์ ภาย์ในฟั1งก ชี้�น strlen

ได�ใน 2 ล�กษณะ ค%อ char *schar *s แบบในตั�วอย์�าง หร์%ออาจำจำะใชี้� char s[ ] char s[ ] ก.ได� โดย์ที่��วไปจำะใชี้�ในล�กษณะแร์ก เพื้ร์าะชี้�วย์ในร์��ได�ที่�นที่�ว�า s เป/นตั�วแปร์พื้อย์น เตัอร์ และย์�งสามูาร์ถส�งส�วนใดส�วนข้องอาร์ เร์ย์ ให�แก�ฟั1งก ชี้�นก.ได� โดย์ไมู�จำ"าเป/นตั�องส�งสมูาชี้2กตั�วแร์กก.ได�เชี้�นก�น

Page 46: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

f (&a[2]) หร์%อ f (a+2)

เป/นการ์ส�งแอดเดร์สข้องสมูาชี้2ก a[2] ให�ก�บฟั1งก ชี้�น f การ์ปร์ะกาศฟั1งก ชี้�น f สามูาร์ถที่"าได�โดย์การ์ปร์ะกาศ

f (int arr[ ]) { ......... }

หร์%อ f (int *arr) { ............ }

ตั�วอย์�าง

Page 47: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

67. การ์ค"านวณก�บแอดเดร์ส

ให� p เป/นพื้อย์น เตัอร์ ชี้��ไปย์�งอาร์ เร์ย์ ใด ๆ ค"าส��ง p++ เป/นการ์เล%�อน p ไปย์�งสมูาชี้2กถ�ดไป และค"าส��ง p += i เป/นการ์เล%�อนพื้อย์น เตัอร์ ไป i ตั"าแหน�งจำากตั"าแหน�งป1จำจำ8บ�น นอกจำากน��ย์�งสามูาร์ถใชี้�เคร์%�องหมูาย์ความูส�มูพื้�นธ์ (Relational Operator) เชี้�น ==, !=, <, >= และอ%�น ๆ ที่"างานร์�วมูก�บพื้อย์น เตัอร์ ได� สมูมูตั2ให� p และ q ชี้��ไปย์�งสมูาชี้2กข้องอาร์ เร์ย์ เด�ย์วก�น

Page 48: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

p < qจำะเป/นจำร์2งเมู%�อ p ชี้��ไปที่��สมูาชี้2กที่��อย์��ก�อนหน�าสมูาชี้2กที่�� q ชี้��อย์�� การ์เปร์�ย์บเที่�ย์บในล�กษณะจำะใชี้�ได�ตั�อเมู%�อ p และ q ชี้��ไปที่��อาร์ เร์ย์ เด�ย์วก�นเที่�าน��น

นอกจำากน��ย์�งสามูาร์ถใชี้�การ์ลบหร์%อการ์บวกก�บพื้อย์น เตัอร์ ได�เชี้�นเด�ย์วก�น แตั�ส2�งที่��ควร์ร์ะว�งค%อ การ์ที่"าเชี้�นน��นจำะตั�องอย์��ในข้อบเข้ตัข้นาดข้องอาร์ เร์ย์ เที่�าน��น

Page 49: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ตั�วอย์�า ง63.

ฟั1งก ชี้�น ( ) ปร์�บปร์8งให�กร์ะชี้�บข้*�น

int strlen (char *s) { char *p = s; while (*p != ‘\0’) p++; return p-s;}

Page 50: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

เน%�องจำาก s ชี้��อย์��ที่��ตั"าแหน�งเร์2�มูตั�น โดย์มู� p ชี้��ไปที่�� s เชี้�นเด�ย์วก�น แตั�จำะมู�การ์เล%�อน p ไปที่�ละหน*�งตั"าแหน�ง จำนกว�าค�าที่��ตั"าแหน�งที่�� p ชี้��อย์��จำะเที่�าก�บ ‘\0’ เมู%�อน"า p ค�าส8ดที่�าย์มูาลบก�บ s ที่��ตั"าแหน�งเร์2�มูตั�นก.จำะได�ความูย์าวข้องข้�อมู�ลที่��ส�งเข้�ามูา

Page 51: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

68 ตั�วชี้��ตั�วอ�กษร์และฟั1งก ชี้�น

(Character Pointer and Function)

การ์ที่"างานก�บข้�อความูหร์%อที่��เร์�ย์กว�า สตัร์2ง (String) เป/นการ์ใชี้�ข้�อมู�ลตั�วอ�กษร์หลาย์ ๆ ตั�ว หร์%ออาร์ เร์ย์ ข้องข้�อมู�ลปร์ะเภที่ char หร์%ออาจำจำะใชี้�พื้อย์น เตัอร์ ชี้��ไปย์�งข้�อมู�ลปร์ะเภที่ char การ์ที่"างานก�บค�าคงที่��สตัร์2ง (String Constant) สามูาร์ถเข้�ย์นภาย์ในเคร์%�อง “ ”

Page 52: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

“I am a string”เมู%�อมู�การ์ใชี้�ค�าคงที่��สตัร์2งจำะมู�การ์พื้%�นที่��ในหน�วย์ความูจำ"าเที่�าก�บความูย์าวข้องค�าคงที่��สตัร์2งบวกด�วย์ 1 เน%�องจำากล�กษณะการ์เก.บข้�อมู�ลปร์ะเภที่ข้�อความูในหน�วย์ความูจำ"าจำะมู�การ์ปะตั�วอ�กษร์ null หร์%อ ‘\0’ ตั�อที่�าย์เสมูอเพื้%�อให�ร์��ว�าเป/นจำ8ดส2�นส8ดข้องข้�อมู�ล การ์จำองพื้%�นที่��ด�งกล�าวจำะเหมู%อนการ์จำองพื้%�นที่��ข้องข้�อมู�ลปร์ะเภที่อาร์ เร์ย์ เป/นอาร์ เร์ย์ ข้อง char

ตั�วอย์�าง

Page 53: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ร์�ปที่�� 68. แสดงแบบจำ"าลองการ์เก.บ ข้�อมู�ลปร์ะเภที่ สตัร์2งในหน�วย์ความู

จำ"า

I a m a s t r i n g \0

Page 54: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ค�าคงที่��สตัร์2งที่��พื้บเห.นได�เสมูอได�แก�ข้�อความูที่��ใชี้�ในฟั1งก ชี้�น printf ( ) เชี้�น

printf ( “Hello, world\n” );

ฟั1งก ชี้�น printf ( ) จำะร์�บพื้าร์ามู2เตัอร์ เป/นพื้อย์น เตัอร์ ชี้��ไปย์�งแอดเดร์สข้องข้�อมู�ลที่��ตั"าแหน�งเร์2�มูตั�นข้องอาร์ เร์ย์ และน"าข้�อความูน��นแสดงออกที่างอ8ปกร์ณ แสดงข้�อมู�ลมูาตัร์ฐาน

Page 55: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ในการ์เข้�ย์นโปร์แกร์มูจำะสามูาร์ถใชี้�พื้อย์น เตัอร์ ชี้��ไปค�าคงที่��สตัร์2งใด ๆ ก.ได� เชี้�น

char *pmessage = “Hello, world”;

pmessage จำะเป/นพื้อย์น เตัอร์ ปร์ะเภที่ char ชี้��ไปที่��อาร์ เร์ย์ ข้องตั�วอ�กษร์ จำะแตักตั�างจำากการ์ใชี้�อาร์ เร์ย์ ที่��วไปเชี้�น

char amessage[ ] = “Hello, world”;

Page 56: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ล�กษณะข้องอาร์ เร์ย์ เชี้�น amessage จำะมู�การ์จำองพื้%�นที่��ใชี้�ก�บอาร์ เร์ย์ ข้นาด 13 ตั�วอ�กษร์ร์วมูที่��ง null ส�วนล�กษณะข้องพื้อย์น เตัอร์ ที่��ชี้��ไปย์�งค�าคงที่��สตัร์2ง จำะมู�การ์จำองพื้%�นที่��ให�ก�บค�าคงที่��สตัร์2งข้นาด 13 ตั�วอ�กษร์เชี้�นเด�ย์วก�น แตั�จำะมู�การ์จำองพื้%�นที่��ให�ก�บพื้อย์น เตัอร์ และที่"าการ์ชี้��พื้อย์น เตัอร์ น��นไปย์�งพื้%�นที่��ข้องค�าคงที่��สตัร์2งที่��จำองเอาไว�

Page 57: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ร์�ปที่�� 69 แสดงการ์จำองพื้%�นที่��ให�ก�บอาร์ เร์ย์ และตั�วชี้��ชี้��ไปย์�งค�าคงที่��สตัร์2ง

H e l l o , w o r l d \0

H e l l o , w o r l d \0amessage

pmessage

Page 58: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

void strpy ( char *s, char *t ) { int i=0; while ( ( s[i] = t[i] ) != ‘\0’ ) i++;}

ตั�วอย์�าง65.

ฟั1งก ชี้�น strcpy ( ) ที่"าหน�าที่��ส"าเนาข้�อความูจำาก

ตั�วแปร์หน*�งไปย์�งอ�กตั�วแปร์หน*�งเข้�ย์นในล�กษณะอาร์ เร์ย์

Page 59: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

void strpy ( char *s, char *t ) { while ( ( *s = *t ) != ‘\0’ ) { s++; t++; }}

ตั�วอย์�าง66.

ฟั1งก ชี้�น strcpy ( ) เข้�ย์นในล�กษณะพื้อย์น

เตัอร์

Page 60: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

void strcpy ( char *s, char *t ) { while ( ( *s++ = *t++ ) != ‘\0’ ) ;}

ตั�วอย์�าง67.

ฟั1งก ชี้�น strcpy ( ) เข้�ย์นในล�กษณะพื้อย์น

เตัอร์ แบบส��น

Page 61: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

69. อาร์ เร์ย์ แบบหลาย์มู2ตั2 (Multi-dimensional

Arrays) จำากพื้%�นฐานที่��ผ�านมูาเร์%�องอาร์ เร์ย์ จำะ

เป/นล�กษณะข้องอาร์ เร์ย์ มู2ตั2เด�ย์ว แตั�อาร์ เร์ย์ อาจำจำะมู�มูากกว�า 1 มู2ตั2ก.ได� เชี้�น ข้�อมู�ลคะแนนสอบข้องน�กศ*กษาแตั�ละคนภาย์ในชี้��นซึ่*�งแบ�งเป/นคะแนนเก.บหลาย์ส�วน จำะพื้บว�าหากตั�องการ์เก.บข้�อมู�ลคะแนนสอบข้องน�กศ*กษาแตั�ละคนสามูาร์ถใชี้�อาร์ เร์ย์ มู2ตั2เด�ย์ว ด�งตั�วอย์�าง

Page 62: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

#define NUMBER_OF_PAPERS 5

int student [ NUMBER_OF_PAPERS ]; * 5/ int student[ ]; */

56 85 126 241 160. . . . .

0student[ ] [1 ]student [2 ]student [3 ]student [4 ]student

Page 63: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

แตั�หากเพื้2�มูเตั2มูว�าให�เก.บข้�อมู�ลคะแนนสอบข้องน�กศ*กษาที่8กคน จำะตั�องใชี้�อาร์ เร์ย์ หลาย์มู2ตั2เข้�ามูาเก��ย์วข้�อง ตั�วอย์�างเชี้�นการ์เก.บข้�อมู�ลคะแนนสอบข้องน�กศ*กษา 2 คนโดย์มู�คะแนนสอบข้องการ์สอบที่��งส2�น 5 คร์��ง

Page 64: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

ร์�ปที่�� 610. แสดงตั�วอย์�างการ์เก.บ ข้�อมู�ลคะแนนข้อง น�กศ*กษา

คร์��งที่�� 1 2 3 4 5

นาย์ ก นาย์ ข้5685.126.241.160

60. 72.150.250.180.

Page 65: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

การ์อ�างอ2งถ*งข้�อมู�ลในอาร์ เร์ย์ 2 มู2ตั2 เร์าจำะมูองอาร์ เร์ย์ 2 มู2ตั2ในล�กษณะที่��ปร์ะกอบด�วย์แถว(row) และคอล�มูน (column) โดย์ข้�อมู�ลที่��อ�างอ2งตั�ว

แร์กหมูาย์ถ*ง แถว และข้�อมู�ลถ�ดมูาค%อ คอล�มูน marks[row][column]

row

column

marks[0][0]

marks[0][1]

marks[0][2]

marks[0][8]

marks[1][0]

marks[1][8]

marks[2][0]

marks[2][8]

Page 66: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

จำากล�กษณะความูตั�องการ์เก.บข้�อมู�ลด�งกล�าวจำะตั�องเตัร์�ย์มูอาร์ เร์ย์ เพื้%�อเก.บข้�อมู�ลในล�กษณะ 2 มู2ตั2 สามูาร์ถปร์ะกาศอาร์ เร์ย์ ด�งน�� #define NUMBER_OF_PAPERS 5 #define NUMBER_OF_STUDENTS 50 int marks[NUMBER_OF_STUDENTS][NUMBER_OF_PAPERS]; /* int marks[50][5]; */

Page 67: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

โปร์แกร์มูการ์ร์�บค�าอาร์ เร์ย์ 2 มู2ตั2#include<stdio.h>main(){ float score[10][3]; int i,j; printf(“Please put score\n”); for(i=0;i<10;i++) for(j=0;j<3;j++) scanf(“%f”,&score[i][j]);}

0 0score[ ][ ]0 1score[ ][ ]0 2score[ ][ ]

1 0score[ ][ ]1 1score[ ][ ]1 2score[ ][ ]

[9 ] [0 ]score 9 1score[ ][ ]9 2score[ ][ ]

Page 68: ตัวชี้และอาร์เรย์ (Pointer  and  Array)

0 0score[ ][ ]0 1score[ ][ ]0 2score[ ][ ]

1 0score[ ][ ]1 1score[ ][ ]1 2score[ ][ ]

[9 ] [0 ]score 9 1score[ ][ ]9 2score[ ][ ]

2 0score[ ][ ]2 1score[ ][ ]2 2score[ ][ ]

ล�กษณะข้�อมู�ล หน�วย์ความูจำ"า

200202204206208210

210212214216218220

220222224226228230

[0][0][0][1][0][2][1][0][1][1][1][2]

[2][0][2][1][2][2][3][0][3][1][3][2]

[4][0][4][1][4][2][5][0][5][1][5][2]