33
บบบบบ 5 บบบบบบบบบบ (Pointer)

บทที่ 5 พอยน์เตอร์ ( Pointer)

  • Upload
    rock

  • View
    61

  • Download
    0

Embed Size (px)

DESCRIPTION

บทที่ 5 พอยน์เตอร์ ( Pointer). พอยน์เตอร์ เป็นชนิดข้อมูลชนิดหนึ่งของภาษาซี มีความเร็วในการทำงานสูง ช่วยให้ การเขียน ภาษาซี มีความยืดหยุ่น การใช้งานพอยน์เตอร์ ค่อนข้างซับ ซ้อน พอยน์เตอร์เป็นจุดเด่นอย่างหนึ่งในการเขียนภาษาซี. 5.1 พอยน์เตอร์กับแอดเดรส (Pointers and Addresses). - PowerPoint PPT Presentation

Citation preview

Page 1: บทที่ 5 พอยน์เตอร์ ( Pointer)

บทท�� 5พอยน์เตอร์ (Pointer)

Page 2: บทที่ 5 พอยน์เตอร์ ( Pointer)

พอยน์เตอร์เป็�น์ชน์�ดข้�อมู�ลชน์�ดหน์��งข้องภาษาซี�

มู�ความูเร์!วใน์การ์ท$างาน์สู�ง ช&วยให�การ์เข้�ยน์ภาษาซี�

มู�ความูย'ดหย(&น์ การ์ใช�งาน์พอยน์เตอร์ค&อน์ข้�างซี)บซี�อน์พอยน์เตอร์เป็�น์จุ(ดเด&น์อย&างหน์��งใน์การ์เข้�ยน์ภาษาซี�

Page 3: บทที่ 5 พอยน์เตอร์ ( Pointer)

5.1 พอยน์เตอร์ก)บแอดเดร์สู

(Pointers and Addresses)ต)วแป็ร์ ค'อช'�อท��ใช�แทน์ข้�อมู�ล เร์าป็ร์ะกาศต)วแป็ร์เป็�น์การ์ก$าหน์ดช'�อเพ'�อใช�แทน์ข้�อมู�ล เมู'�อเร์าป็ร์ะกาศต)วแป็ร์ จุะมู�การ์จุองเน์'.อท��ใน์หน์&วยความูจุ$าเพ'�อเก!บข้�อมู�ล เร์าสูามูาร์ถเข้�าถ�งข้�อมู�ลได�โดยอ�างถ�งต)วแป็ร์การ์ป็ร์ะกาศต)วแป็ร์ เช&น์

int i; เป็�น์การ์ป็ร์ะกาศ (Declaration) ต)วแป็ร์ช'�อ i เป็�น์ต)วแป็ร์ป็ร์ะเภท int

Page 4: บทที่ 5 พอยน์เตอร์ ( Pointer)

ภาพจุ$าลองการ์แทน์ข้�อมู�ลใน์หน์&วยความูจุ$า

i 400

402

404

inti;i = 10;

10

Page 5: บทที่ 5 พอยน์เตอร์ ( Pointer)

แต&มู�อ�กว�ธี�ท��จุะเข้�าถ�งต)วแป็ร์ ค'อเร์าจุะอ�างถ�งต$าแหน์&งท��เก!บข้�อมู�ล

พอยน์เตอร์ เป็�น์ชน์�ดข้�อมู�ลชน์�ดหน์��งข้องภาษาซี� แตกต&างจุากชน์�ดข้�อมู�ลพ'.น์ฐาน์อ'�น์ ๆ ต)วแป็ร์พอยน์เตอร์ เป็�น์ต)วแป็ร์ท��ใช�เก!บค&าแอดเดร์สูข้องต)วแป็ร์อ'�น์ ๆ

Page 6: บทที่ 5 พอยน์เตอร์ ( Pointer)

หากมู� ต)วแป็ร์ i เป็�น์ต)วแป็ร์ป็ร์ะเภท int และ ต)วแป็ร์ p เป็�น์ต)วแป็ร์ป็ร์ะเภทพอยน์เตอร์p เก!บค&าแอดเดร์สูข้องต)วแป็ร์ i (หร์'อ p ช�.ไป็ท��ต)วแป็ร์ i) สูามูาร์ถจุ$าลองการ์แทน์ข้�อมู�ลใน์หน์&วยความูจุ$าด)งร์�ป็

p

i10

p

i10

360

400

10

400

Page 7: บทที่ 5 พอยน์เตอร์ ( Pointer)

52 การ์ป็ร์ะกาศต)วแป็ร์พอยน์เตอร์

ใช�การ์ด$าเน์�น์การ์ชน์�ดเอกภาค (Unary Operator) * ช'�อเร์�ยกเป็�น์ภาษาอ)งกฤษว&า Indirection หร์'อ Dereferencing Operator ร์�ป็แบบค$าสู)�งType *Variable-name;Type ชน์�ดข้องต)วแป็ร์* เป็�น์เคร์'�องหมูายท��แสูดงว&า ต)วแป็ร์ท��ตามูหล)ง

เคร์'�องหมูายน์�.เป็�น์ต)วแป็ร์ชน์�ดพอยน์เตอร์Variable-name ช'�อต)วแป็ร์ท��เป็�น์ต)วแป็ร์พอยน์เตอร์

Page 8: บทที่ 5 พอยน์เตอร์ ( Pointer)

ต)วแป็ร์พอยน์เตอร์ เป็�น์ต)วช�.ไป็ย)งต)วแป็ร์ชน์�ดอ'�น์ๆการ์ป็ร์ะกาศชน์�ดข้องต)วแป็ร์พอยน์เตอร์ ต�องสูอดคล�องก)บชน์�ดข้องต)วแป็ร์น์).น์ๆเช&น์ char *prt;

int *ip , *temp; double *dp;

ป็ร์ะกาศต)วแป็ร์ prt ให�เป็�น์ต)วแป็ร์พอยน์เตอร์ท��ช�.ไป็ย)งต)วแป็ร์ชน์�ด chr

ป็ร์ะกาศต)วแป็ร์ ip และ ต)วแป็ร์ temp เป็�น์ต)วแป็ร์พอยน์เตอร์ท��ช�.ไป็ย)งต)วแป็ร์ชน์�ด int

ป็ร์ะกาศต)วแป็ร์ ip และ ต)วแป็ร์ tempเป็�น์ต)วแป็ร์พอยน์เตอร์ท��ช�.ไป็ย)งต)ว

Page 9: บทที่ 5 พอยน์เตอร์ ( Pointer)

53 การ์ก$าหน์ดค&าและการ์อ&าน์ค&าต)วแป็ร์พอยน์เตอร์ การ์ก$าหน์ดค&าให�ก)บต)วแป็ร์พอยน์เตอร์ เป็�น์การ์

ก$าหน์ด แอดเดร์สูข้องต)วแป็ร์ท��มู�ชน์�ดข้�อมู�ลสูอดคล�องก)บชน์�ดข้�อมู�ลข้องต)วแป็ร์พอยน์เตอร์

ใช� ต)วด$าเน์�น์การ์ชน์�ดเอกภาค (Unary Operator) & เป็�น์ต)วด$าเน์�น์การ์ท��อ�างถ�งแอดเดร์สู

ต)วด$าเน์�น์การ์ & เป็�น์เคร์'�องหมูายท��ใช�เมู'�อต�องการ์ให�เอาค&าต$าแหน์&งท��อย�& (address ) ข้องต)วแป็ร์ท��เก!บใน์หน์&วยความูจุ$าออกมูาใช�

ต)วด$าเน์�น์การ์ * เป็�น์เคร์'�องหมูายท��ใช�เมู'�อต�องการ์ให�น์$าค&าท��อย�&ใน์ต$าแหน์&งท��ต)วแป็ร์พอยน์เตอร์น์).น์ช�.อย�&ออกมูาแสูดง

Page 10: บทที่ 5 พอยน์เตอร์ ( Pointer)

ต)วอย&าง1 10*int x= , y; y = &x;

ต)วอย&าง 2 int count , val ,* ptr;

count100= ;

ptr =&;

*val = ptr;

Page 11: บทที่ 5 พอยน์เตอร์ ( Pointer)

ต)วอย&าง 3 * *int a , prt , b , c , d;

=2 5; prt = &a;

b = a; *c = prt;

d= prt;

Page 12: บทที่ 5 พอยน์เตอร์ ( Pointer)

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

ต)วอย&าง

Page 13: บทที่ 5 พอยน์เตอร์ ( Pointer)

x

y

int x =1, y =2; 400

402

500

502

1

2int *ip, *iq;

ip

iq

1

2

ก$าหน์ดให� x และ เป็�น์ต)วแป็ร์ชน์�ด int เก!บค&า 1 และ 2 ตามูล$าด)บ

ip และ iq เป็�น์ต)วแป็ร์พอยน์เตอร์ ซี��งช�.ไป็ท��ชน์�ดข้�อมู�ล int

Page 14: บทที่ 5 พอยน์เตอร์ ( Pointer)

x

y

400

402

500

502

1

2

ip

iq

400

3 ip = &x;

ให� ip ช�.ไป็ท�� x ด)งน์).น์ ท�� ip

เก!บaddress ท�� ip ช�.ไป็ address ท�� ip ช�.ไป็ ค'อ

400

Page 15: บทที่ 5 พอยน์เตอร์ ( Pointer)

x

y

400

402

500

502

1

2

ip

iq

400

1

i = *ip;

4

y = ค&า ท�� addrerss น์�. point ไป็

น์)�น์ค'อ ip ช�. ท�� 400 ค&าท�� ต$าแหน์&ง 400 ค'อ 1

Page 16: บทที่ 5 พอยน์เตอร์ ( Pointer)

0 *ip =0;

5

ก$าหน์ดให� ค&า ท�� addrerss น์�. point ไป็ มู�ค&า เท&าก)บ0

น์)�น์ค'อ ip ช�. ท�� 400 ค&าท��ต$าแหน์&ง400 ค'อ 1 เป็ล��ยน์เป็�น์0

x

y

400

402

500

502

1

1

ip

iq

400

Page 17: บทที่ 5 พอยน์เตอร์ ( Pointer)

x

y

400

402

500

502

0

1

ip

iq

400

5

y = 5;6

Page 18: บทที่ 5 พอยน์เตอร์ ( Pointer)

x

y

400

402

500

502

0

5

ip

iq

400

ip =&y;

7

402

ให� ipช�. ไป็ท�� y

ด)งน์).น์ ท�� ip จุ�งเก!บ address ข้อง y ค'อ 402

Page 19: บทที่ 5 พอยน์เตอร์ ( Pointer)

8x

y

400

402

500

502

0

5

ip

iq

402

*ip =3 ;

3

ก$าหน์ดให� ค&า ท�� addrerss น์�. point ไป็ มู�ค&า เท&าก)บ3

น์)�น์ค'อ ip ช�. ท�� 402 ค&าท��ต$าแหน์&ง402 ค'อ 5 เป็ล��ยน์เป็�น์3

Page 20: บทที่ 5 พอยน์เตอร์ ( Pointer)

9

x

y

400

402

500

502

0

3

ip

iq

402

iq =ip;

เป็�น์น์$าค&าaddress ท�� เก!บใน์ ip ให�ก)บ iq ด)งน์).น์ iq จุ�งมู�ค&า 402

หมูายความูว&า iq ช�. ไป็ท�� y

402

Page 21: บทที่ 5 พอยน์เตอร์ ( Pointer)

54 พอยน์เตอร์และอาร์ก�วเมูน์ทข้องฟั8งกช)น์ (Pointers an

d Function Arguments)ภาษาซี�มู�การ์สู&งอาร์ก�วเมูน์ทให�ก)บฟั8งกช)น์แบบ By Value และฟั8งกช)น์สูามูาร์ถค'น์ค&า (return) ค&าได�เพ�ยงหน์��งค&า หากต�องการ์ให�ฟั8งกช)น์มู�การ์เป็ล��ยน์แป็ลงค&าและค'น์ค&ากล)บมูาย)งฟั8งกช)น์ท��เร์�ยกใช�มูากกว&าหน์��งค&าจุะต�องน์$าพอยน์เตอร์เข้�ามูาช&วย เช&น์ หากต�องการ์เข้�ยน์ฟั8งกช)น์เพ'�อสูล)บค&าข้องต)วแป็ร์ 2 ต)ว ผลล)พธีท��ต�องการ์ได�จุากฟั8งกช)น์น์�.จุะมู�ค&าข้องต)วแป็ร์ 2 ต)วท��ท$าการ์สูล)บค&าก)น์

Page 22: บทที่ 5 พอยน์เตอร์ ( Pointer)

ต)วอย&างท�� 51 โป็ร์แกร์มูต)วอย&างการ์สูล)บค&าต)วแป็ร์ 2 ต)วโดยผ&าน์ฟั8งกช)น์ จุะแสูดงการ์ร์)บพาร์ามู�เตอร์เป็�น์ต)วแป็ร์ชน์�ดพอยน์เตอร์#include <stdio.h>void swap (int *, int *);void main ( ) { int x = 5, y = 10; printf(“Before swap : x = %d y = %d\n”, x, y); swap ( &x, &y); /* Pass address of x and y to swap( ) */ printf(“After swap : x = %d y = %d\n”, x, y);}

void swap (int *px, int *py) { int temp; temp = *px; /* Keep x value to temp */ *px = *py; /* Assign y value to x */ *py = temp; /* Assign old x value to y */}

Page 23: บทที่ 5 พอยน์เตอร์ ( Pointer)

ต)วอย&างท�� 54. เข้�ยน์โป็ร์แกร์มูเพ'�อร์)บข้�อมู�ลจุ$าน์วน์จุร์�ง 3 จุ$าน์วน์จุากผ��ใช�และหาค&าเฉล��ยข้องค&าท��ร์)บเข้�ามูาท).งหมูด โดยเข้�ยน์ใน์ล)กษณะการ์สู&งอาร์ก�วเมูน์ทแบบพอยน์เตอร์

ว�เคร์าะห input-process-outputมู� 3 งาน์ย&อย - ร์)บข้�อมู�ล 3 จุ$าน์วน์

- หาค&าเฉล��ย- แสูดงผลล)พธี

Page 24: บทที่ 5 พอยน์เตอร์ ( Pointer)

#include <stdio.h>void readData(int, double *);void calAverage(double, double, double, double *);void printData(double, double, double, double);

Page 25: บทที่ 5 พอยน์เตอร์ ( Pointer)

void main( ) { double x1, x2, x3, average; readData(1, &x1); readData(2, &x2); readData(3, &x3); calAverage(x1, x2, x3, &average); printData(x1, x2, x3, average);}

Page 26: บทที่ 5 พอยน์เตอร์ ( Pointer)

void readData(int seq, double *px) { printf("Enter value %d : ", seq); scanf("%lf", px);}void calAverage(double a1, double a2, double a3, double *pAvg) { *pAvg = (a1 + a2 + a3)/3.0;}void printData(double b1, double b2, double b3, double avg) { printf("Average of %.2lf, %.2lf, %.2lf is %.2lf", b1, b2, b3, avg);}

Page 27: บทที่ 5 พอยน์เตอร์ ( Pointer)

ต)วอย&างท�� 55. โจุทยเด�ยวก)บต)วอย&างท�� 5 .4 ค'อ เข้�ยน์โป็ร์แกร์มูเพ'�อร์)บข้�อมู�ลจุ$าน์วน์จุร์�ง 3 จุ$าน์วน์จุากผ��ใช�และหาค&าเฉล��ยข้องค&าท��ร์)บเข้�ามูาท).งหมูด โดยเข้�ยน์ใน์ล)กษณะพอยน์เตอร์ แต&เข้�ยน์ใน์อ�กล)กษณะหน์��ง#include <stdio.h>void readData(double *, double *, double *);void calAverage(double *, double *, double *, double *);void printData(double *, double *, double *, double *);

Page 28: บทที่ 5 พอยน์เตอร์ ( Pointer)

void main( ) { double x1, x2, x3, average; readData(&x1, &x2, &x3); calAverage(&x1, &x2, &x3, &average); printData(&x1, &x2, &x3, &average);}

Page 29: บทที่ 5 พอยน์เตอร์ ( Pointer)

void readData(double *px1, double *px2, double *px3) { printf("Enter value 1 : "); scanf("%lf", px1); printf("Enter value 2 : "); scanf("%lf", px2); printf("Enter value 3 : "); scanf("%lf", px3);}

Page 30: บทที่ 5 พอยน์เตอร์ ( Pointer)

void calAverage(double *pa1, double *pa2, double *pa3,

double *pAvg) { *pAvg = (*pa1 + *pa2 + *pa3)/3.0;}void printData(double *pb1, double *pb2, double *pb3, double *pAvg) { printf("Average of %.2lf, %.2lf, %.2lf is %.2lf", *pb1, *pb2, *pb3, *pAvg);}

Page 31: บทที่ 5 พอยน์เตอร์ ( Pointer)

ต)วอย&างท�� 56 เข้�ยน์โป็ร์แกร์มูเพ'�อค$าน์วณพ'.น์ท��ข้องสู��เหล��ยมูร์�ป็หน์��ง โดยร์)บข้�อมู�ลความูกว�างและความูยาวข้องร์�ป็สู��เหล��ยมูจุากผ��ใช� ก$าหน์ดให�ใช�ฟั8งกช)น์เพ'�อค$าน์วณพ'.น์ท��ข้องร์�ป็สู��เหล��ยมูด)งโป็ร์โตไทป็=

void calRecArea(float, float, float *);โดยท�� พาร์ามู�เตอร์ต)วแร์กค'อความูกว�าง

พาร์ามู�เตอร์ต)วท�� 2 ค'อความูยาว และพาร์ามู�เตอร์ต)วท�� 3 ค'อพ'.น์ท��ข้องร์�ป็

สู��เหล��ยมู

Page 32: บทที่ 5 พอยน์เตอร์ ( Pointer)

#include <stdio.h>void main( ) { float width, length, area; printf("Enter width : "); scanf("%f", &width); printf("Enter length : "); scanf("%f", &length); calRecArea(width, length, &area); printf("Rectangle area is %.2f", area);}

void calRecArea(float w, float l, float *pArea) { *pArea = w * l;}

Page 33: บทที่ 5 พอยน์เตอร์ ( Pointer)

จบ