5 pointer
Download
Skip this Video
Download Presentation
บทที่ 5 พอยน์เตอร์ ( Pointer)

Loading in 2 Seconds...

play fullscreen
1 / 33

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


  • 152 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' บทที่ 5 พอยน์เตอร์ ( Pointer)' - rock


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide2

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

มีความเร็วในการทำงานสูง ช่วยให้การเขียนภาษาซี

มีความยืดหยุ่น

การใช้งานพอยน์เตอร์ค่อนข้างซับซ้อน

พอยน์เตอร์เป็นจุดเด่นอย่างหนึ่งในการเขียนภาษาซี

5 1 pointers and addresses

5.1 พอยน์เตอร์กับแอดเดรส (Pointers and Addresses)

ตัวแปร คือชื่อที่ใช้แทนข้อมูล

เราประกาศตัวแปรเป็นการกำหนดชื่อเพื่อใช้แทนข้อมูล เมื่อเราประกาศตัวแปร จะมีการจองเนื้อที่ในหน่วยความจำเพื่อเก็บข้อมูล เราสามารถเข้าถึงข้อมูลได้โดยอ้างถึงตัวแปร

การประกาศตัวแปร เช่น

int i;

เป็นการประกาศ (Declaration) ตัวแปรชื่อ i เป็นตัวแปรประเภท int

slide4

int i;

i

400

402

404

i = 10;

10

ภาพจำลองการแทนข้อมูลในหน่วยความจำ

slide5

แต่มีอีกวิธีที่จะเข้าถึงตัวแปร

คือเราจะอ้างถึงตำแหน่งที่เก็บข้อมูล

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

แตกต่างจากชนิดข้อมูลพื้นฐานอื่น ๆ

ตัวแปรพอยน์เตอร์เป็นตัวแปรที่ใช้เก็บค่าแอดเดรสของตัวแปรอื่น ๆ

slide6

p

p

i

360

400

400

10

i

10

10

หากมี ตัวแปร i เป็นตัวแปรประเภท int

และ ตัวแปร p เป็นตัวแปรประเภทพอยน์เตอร์

p เก็บค่าแอดเดรสของตัวแปร i

(หรือ p ชี้ไปที่ตัวแปร i)

สามารถจำลองการแทนข้อมูลในหน่วยความจำดังรูป

slide7

5.2 การประกาศตัวแปรพอยน์เตอร์

ใช้การดำเนินการชนิดเอกภาค (Unary Operator) *

ชื่อเรียกเป็นภาษาอังกฤษว่า Indirection

หรือ Dereferencing Operator

รูปแบบคำสั่งType *Variable-name;

Type ชนิดของตัวแปร

* เป็นเครื่องหมายที่แสดงว่า ตัวแปรที่ตามหลัง

เครื่องหมายนี้เป็นตัวแปรชนิดพอยน์เตอร์

Variable-nameชื่อตัวแปรที่เป็นตัวแปรพอยน์เตอร์

slide8

ประกาศตัวแปร prt ให้เป็นตัวแปรพอยน์เตอร์

ที่ชี้ไปยังตัวแปรชนิด chr

ประกาศตัวแปร ip และ ตัวแปร temp

เป็นตัวแปรพอยน์เตอร์ที่ชี้ไปยังตัวแปรชนิด int

ตัวแปรพอยน์เตอร์ เป็นตัวชี้ไปยังตัวแปรชนิดอื่นๆ

การประกาศชนิดของตัวแปรพอยน์เตอร์ ต้องสอดคล้องกับชนิดของตัวแปรนั้นๆ

เช่น char *prt;

int *ip , *temp;

double *dp;

ประกาศตัวแปร ip และ ตัวแปร temp

เป็นตัวแปรพอยน์เตอร์ที่ชี้ไปยังตัว

slide9
5.3 การกำหนดค่าและการอ่านค่าตัวแปรพอยน์เตอร์
  • การกำหนดค่าให้กับตัวแปรพอยน์เตอร์ เป็นการกำหนด แอดเดรสของตัวแปรที่มีชนิดข้อมูลสอดคล้องกับชนิดข้อมูลของตัวแปรพอยน์เตอร์
  • ใช้ ตัวดำเนินการชนิดเอกภาค (Unary Operator) & เป็นตัวดำเนินการที่อ้างถึงแอดเดรส
  • ตัวดำเนินการ & เป็นเครื่องหมายที่ใช้เมื่อต้องการให้เอาค่าตำแหน่งที่อยู่(address) ของตัวแปรที่เก็บในหน่วยความจำออกมาใช้
  • ตัวดำเนินการ * เป็นเครื่องหมายที่ใช้เมื่อต้องการให้นำค่าที่อยู่ในตำแหน่งที่ตัวแปรพอยน์เตอร์นั้นชี้อยู่ออกมาแสดง
1 int x 10 y y x 2

int count , val ,* ptr;

count =100;

ptr = &count;

val = *ptr;

ตัวอย่าง1 int x=10,*y;

y = &x;

ตัวอย่าง 2

3 int a prt b c d a 25 prt a b a c prt d prt
ตัวอย่าง 3

int a , *prt , b , c ,*d;

a = 25;

prt = &a;

b = a;

c = *prt;

d= prt;

int x 1 y 2 int ip iq ip x y ip ip 0 y 5 ip y ip 3 iq ip

ตัวอย่าง

int x = 1, y = 2;

int *ip, *iq;

ip = &x;

y = *ip;

*ip = 0;

y = 5;

ip = &y;

*ip = 3;

iq = ip;

slide13

int x =1, y =2;

1

1

x

y

400

402

500

502

int *ip, *iq;

2

2

ip

iq

กำหนดให้ x และ เป็นตัวแปรชนิด int เก็บค่า 1 และ 2 ตามลำดับ

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

slide14

ip = &x;

3

1

x

y

400

402

500

502

2

400

ip

iq

ให้ ip ชี้ไปที่ x

ดังนั้น ที่ ip เก็บaddress ที่ ip ชี้ไป

address ที่ ip ชี้ไปคือ 400

slide15

4

y = *ip;

1

1

x

y

400

402

500

502

2

400

ip

iq

y = ค่า ที่ addrerss นี้ point ไป

นั่นคือ ip ชี้ที่ 400 ค่าที่ตำแหน่ง 400 คือ 1

slide16

5

*ip = 0;

0

1

x

y

400

402

500

502

1

400

ip

iq

กำหนดให้ ค่า ที่ addrerss นี้ point ไป มีค่า เท่ากับ 0

นั่นคือ ip ชี้ที่ 400 ค่าที่ตำแหน่ง 400 คือ 1 เปลี่ยนเป็น 0

slide17

6

y = 5;

5

0

x

y

400

402

500

502

1

400

ip

iq

slide18

7

ip = &y;

0

x

y

400

402

500

502

5

402

400

ip

iq

ให้ ipชี้ ไปที่ y

ดังนั้น ที่ ip จึงเก็บ address ของ y คือ 402

slide19

*ip = 3;

3

0

x

y

400

402

500

502

5

402

ip

iq

กำหนดให้ ค่า ที่ addrerss นี้ point ไป มีค่า เท่ากับ 3

นั่นคือ ip ชี้ที่ 402 ค่าที่ตำแหน่ง 402 คือ 5 เปลี่ยนเป็น 3

8

slide20

iq = ip;

0

x

y

400

402

500

502

3

402

ip

iq

402

เป็นนำค่าaddress ที่เก็บใน ip ให้กับ iq ดังนั้น iq จึงมีค่า 402

หมายความว่า iq ชี้ ไปที่ y

9

5 4 pointers and function arguments

5.4 พอยน์เตอร์และอาร์กิวเมนท์ของฟังก์ชัน (Pointers and Function Arguments)

ภาษาซีมีการส่งอาร์กิวเมนท์ให้กับฟังก์ชันแบบ By Value และฟังก์ชันสามารถคืนค่า (return) ค่าได้เพียงหนึ่งค่า

หากต้องการให้ฟังก์ชันมีการเปลี่ยนแปลงค่าและคืนค่ากลับมายังฟังก์ชันที่เรียกใช้มากกว่าหนึ่งค่า

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

slide22

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 */

}

ตัวอย่างที่ 5.1 โปรแกรมตัวอย่างการสลับค่าตัวแปร 2 ตัวโดยผ่านฟังก์ชัน จะแสดงการรับพารามิเตอร์เป็นตัวแปรชนิดพอยน์เตอร์

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

}

slide23

ตัวอย่างที่ 5.4 เขียนโปรแกรมเพื่อรับข้อมูลจำนวนจริง

3 จำนวนจากผู้ใช้และหาค่าเฉลี่ยของค่าที่รับเข้ามาทั้งหมด โดยเขียนในลักษณะการส่งอาร์กิวเมนท์แบบพอยน์เตอร์

วิเคราะห์ input-process-output

มี 3 งานย่อย - รับข้อมูล 3 จำนวน

- หาค่าเฉลี่ย

- แสดงผลลัพธ์

slide24

#include <stdio.h>

void readData(int, double *);

void calAverage(double, double, double, double *);

void printData(double, double, double, double);

slide25

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

}

slide26

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

}

slide27

ตัวอย่างที่ 5.5 โจทย์เดียวกับตัวอย่างที่ 5.4 คือ เขียนโปรแกรมเพื่อรับข้อมูลจำนวนจริง 3 จำนวนจากผู้ใช้และหาค่าเฉลี่ยของค่าที่รับเข้ามาทั้งหมด โดยเขียนในลักษณะพอยน์เตอร์ แต่เขียนในอีกลักษณะหนึ่ง

#include <stdio.h>

void readData(double *, double *, double *);

void calAverage(double *, double *, double *, double *);

void printData(double *, double *, double *, double *);

slide28

void main( ) {

double x1, x2, x3, average;

readData(&x1, &x2, &x3);

calAverage(&x1, &x2, &x3, &average);

printData(&x1, &x2, &x3, &average);

}

slide29

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

}

slide30

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

}

slide31

ตัวอย่างที่ 5.6 เขียนโปรแกรมเพื่อคำนวณพื้นที่ของสี่เหลี่ยมรูปหนึ่ง โดยรับข้อมูลความกว้างและความยาวของรูปสี่เหลี่ยมจากผู้ใช้ กำหนดให้ใช้ฟังก์ชันเพื่อคำนวณพื้นที่ของรูปสี่เหลี่ยม

ดังโปรโตไทป์

void calRecArea(float, float, float *);

โดยที่ พารามิเตอร์ตัวแรกคือความกว้าง

พารามิเตอร์ตัวที่ 2 คือความยาว

และพารามิเตอร์ตัวที่ 3 คือพื้นที่ของรูปสี่เหลี่ยม

slide32

void calRecArea(float w, float l, float *pArea) {

*pArea = w * l;

}

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

}

ad