Structure programming
This presentation is the property of its rightful owner.
Sponsored Links
1 / 69

Structure Programming การเขียนโปรแกรมแบบโครงสร้าง PowerPoint PPT Presentation


  • 47 Views
  • Uploaded on
  • Presentation posted in: General

Structure Programming การเขียนโปรแกรมแบบโครงสร้าง. สัปดาห์ที่ 11 ตัว แปรชี้ตำแหน่ง (Pointer). objectives. เพื่อให้นิสิตรู้จักและเข้าใจ ตัวแปรชี้ตำแหน่ง ในภาษาซี สามารถ เขียนโปรแกรมภาษาซี โดย ใช้ตัวแปรชี้ตำแหน่งได้

Download Presentation

Structure Programming การเขียนโปรแกรมแบบโครงสร้าง

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


Structure programming

Structure Programmingการเขียนโปรแกรมแบบโครงสร้าง

สัปดาห์ที่ 11

ตัวแปรชี้ตำแหน่ง(Pointer)


Objectives

objectives

  • เพื่อให้นิสิตรู้จักและเข้าใจตัวแปรชี้ตำแหน่งในภาษาซี

  • สามารถเขียนโปรแกรมภาษาซีโดยใช้ตัวแปรชี้ตำแหน่งได้

  • สามารถนำความรู้เรื่องตัวแปรชี้ตำแหน่งไปประยุกต์เพื่อแก้ไขโจทย์ปัญหาในชีวิตประจำวันได้ได้อย่างถูกต้องเหมาะสม


Outline

Outline

1

Pointer

2

Arithmetic & Pointer Operator

p

3

Array of Pointer& Array-Pointer Relate

Pointer to Pointer & Pointer to Structure

4

5

Assignment


Variable declaration

ที่อยู่

10000

10001

10002

10003

10004

10005

10006

10007

ข้อมูล

Variable Declaration

  • เมื่อมีการประกาศตัวแปรใดๆ เช่น

    int number;

    char letter;

    คอมไพเลอร์จะทำการจองพื้นที่ในหน่วยความจำสำหรับเก็บค่าตัวแปร number และค่าตัวแปร letter สมมุติว่าเป็นตำแหน่งหน่วยความจำที่ 10000 และ 10002 เมื่อมีการกำหนดจะทำการจองหน่วยความจำดังนี้

    number=5;

    letter=‘A’;

5

‘A’

number

letter


Variable declaration cont

Variable Declaration(cont.)

ที่อยู่ของข้อมูล

(Address)

ข้อมูล

ประเภท

ชื่อตัวแปร

ขนาด

0000

15

count

2 bytes

int

0001

0002

3.1415

0003

pi

float

4 bytes

0004

0005

0006

'A'

char

ch

1 bytes

XXXX


Size of variable

Size of Variable


Size of variable cont

Type

Bits

Bytes

int

16

2

unsigned int

16

2

long

32

4

unsigned long

32

4

char

8

1

unsigned char

8

1

float

32

4

double

64

8

long double

80

10

Size of Variable (cont.)


Basic knowledge of pointer

Basic Knowledge of Pointer

  • ภาษาซีมีตัวแปรที่มีส่วนทำให้โปรแกรมกระชับยิ่งขึ้นในการทำงาน ตัวแปรชนิดนี้เรียกว่า“ตัวแปรชี้ตำแหน่ง หรือ พอยน์เตอร์ (Pointer)”

  • พอยน์เตอร์ หมายถึง ตัวแปรใดๆ ที่ใช้เก็บค่าของตำแหน่งที่อยู่ (Address) ของตัวแปรหรือข้อมูล

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

  • ตัวแปรชนิดพอยน์เตอร์มีความเร็วในการทำงานสูง

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


Pointer declaration

Pointer Declaration

type*pointer_name

typeคือชนิดของตัวแปรประเภทตัวชี้ (pointer)

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

pointer_nameคือชื่อของตัวแปรประเภทตัวชี้

  • ตัวอย่างการใช้ตัวชี้

    int*ptr_int;/* pointer to integer */

    float*ptr_float;// pointer to float

    char*ptr_char;/* pointer to char */


Pointer declaration cont

Pointer Declaration (cont.)

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

  • char*prt;

  • int*ip , *temp;

  • double*dp;

ประกาศตัวแปร prtให้เป็นตัวแปรพอยน์เตอร์ที่ชี้ไปยัง

ตัวแปรชนิด char

ประกาศตัวแปร ipและ ตัวแปร temp เป็นตัวแปรพอยน์-

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

ประกาศตัวแปร dp เป็นตัวแปรพอยน์เตอร์ที่ชี้ไป

ยังตัวแปรชนิด double


Referencing operator

Referencing Operator “&”

ตัวดำเนินการ & (Referencing Operator)

ตัวดำเนินการ & ส่งกลับเลขที่อยู่ (Address) ของวัตถุ

XXXX

int

count;

15

int

*ptr;

XXXX

ptr = &count; /* ptrมีค่าเป็น XXXX */


How the pointer work

How the pointer work?

  • ตัวดำเนินการอ้างถึงที่อยู่ (Reference/Address operator) จะใช้เครื่องหมาย & นำหน้าตัวแปร ซึ่งหมายถึงตำแหน่งที่อยู่ของตัวแปรนั้นในหน่วยความจำ

    #include <stdio.h>

    void main(void){

    int z = 10;

    int *ZPtr;

    ZPtr = &z;/*ตัวแปรชนิดตัวชี้เก็บเลขที่อยู่ของตัวแปร z*/

    }


Referencing operator cont

Referencing Operator “&” (cont.)

ที่อยู่ของข้อมูล

(Address)

ข้อมูล

ขนาด

ประเภท

ชื่อตัวแปร

0000

15

count

2 bytes

int

0001

0002

3.1415

0003

pi

float

4 bytes

0004

0005

0006

'A'

char

ch

1 bytes

ptr = &count

ตัวชี้ ptr ชี้ไปที่อยู่ของ

ตัวแปรชื่อ count

XXXX

0000


Referencing operator cont1

Referencing Operator “&” (cont.)

ที่อยู่ของข้อมูล

(Address)

ชื่อตัวแปร

ขนาด

ประเภท

ข้อมูล

count

2 bytes

int

15

0000

pi

float

4 bytes

3.1415

0002

'A'

0006

char

ch

1 bytes

0006

char

*ptr_char = &ch;

0002

float

*ptr_float = &pi;

0000

int

*ptr_int = &count;


Dereference operator

Dereference Operator “*”

เป็นตัวดำเนินการเชิงอ้อม (Indirection) หรือกลับการอ้างอิง (Dereferencing)

ตำแหน่งที่XXXX

15

int

count;

XXXX

int

* ptr;

int count = 15, y, z[10];

int *ptr;/* ptr เป็นตัวชี้ int*/

ptr= &count;/* ptr ชี้ไปที่ count*/

y= *ptr;/* y มีค่า 15*/

*ptr= 0;/* count มีค่า 0*/

ptr= &z[0];/* ptr ชี้ไปที่ z[0]*/


Dereference operator cont

Dereference Operator “*” (cont.)

  • ตัวดำเนินการอ้างถึง (Dereferencing operator) ใช้เครื่องหมาย * นำหน้าตัวแปรพอยน์เตอร์ จะเป็นการอ้างถึงค่าข้อมูลที่ตัวแปรพอยน์เตอร์นั้นชี้ไป ซึ่งค่าข้อมูลนี้สามารถเปลี่ยนแปลงค่าได้

    #include <stdio.h>

    void main(void){

    int x;

    int y = 20;

    int *z;

    z = &y;

    x = *z;/*เป็นการอ้างถึงค่าข้อมูลที่ตัวแปรชนิดตัวชี้*/

    printf (“%d”, x)/*ได้ผลลัพธ์คือ 20*/

    }

  • ให้ตัวแปรพอยน์เตอร์ z ชี้ไปยังแอดเดรสของตัวแปร y โดยการให้ z เก็บตำแหน่งแอดเดรสของ y นั้นเอง


How to show the pointer value

How to show the pointer value?

  • ฟังก์ชัน printfสามารถแสดงตำแหน่งที่อยู่ (address) ได้โดยใช้

    • เครื่องหมาย %p เพื่อแสดงตำแหน่งเป็นเลขฐานสิบหก

    • เครื่องหมาย %u เพื่อแสดงตำแหน่งเป็นเลขฐานสิบ

  • ผลลัพธ์ที่ได้จะอยู่ในรูปแบบ XXXX:YYYYหรือ XXXXขึ้นอยู่กับ Memory Model ที่ใช้


Example 1

letter

num

point

D

19

26.09

0000

0002

0004

pt_point

pt_num

pt_letter

????

????

????

Example 1

#include<stdio.h>

#include<conio.h>

int main()

{

char letter = 'D';

int num = 19;

float point = 26.09;

char *pt_letter;

int*pt_num;

float *pt_point;

pt_letter= &letter;

pt_num= &num;

pt_point= &point;

printf("Address of letter = %p \n",pt_letter);

printf("Address of num = %p \n",pt_num);

printf("Address of point = %p \n",pt_point);

return 0;

}

0002

0000

0004


Example 1 cont

letter

num

point

D

19

26.09

0000

0002

0004

pt_letter

pt_num

pt_point

0000

0002

0004

????

????

????

Example 1 (cont.)

Address of letter = 0000

Address of num = 0002

Address of point = 0004


Example 2

Example 2

int main()

{

int num1= 113,num2;

float price1 = 4.85;

char hint1= 'J',hint2;

int*pt_num;

float *pt_price;

char *pt_hint;

pt_num= &num1;

pt_price= &price1;

pt_hint= &hint1;

num2= *pt_num;

hint2= *pt_hint;

printf("Variable num1= %d \n", num2);

printf("Variable price1 = %f \n",*pt_price);

printf("Variable hint2= %c \n", hint2);

return 0;

}

num1

price1

hint1

113

4.85

J

--x--

--y--

--z--

pt_num

pt_price

pt_hint

--x--

--y--

--z--

num2

hint2

113

J


Example 2 cont

Example 2 (cont.)

num1

price1

hint1

113

4.85

J

Variable num1= 113

Variable price1 = 4.850000

Variable hint2= J

--x--

--y--

--z--

pt_num

pt_price

pt_hint

--x--

--y--

--z--

num2

hint2

113

J


The other format of reference and dereference operators

printf ("The address of a is %p\n"

"The value of aPtr is %p\n\n", &a, aPtr);

printf ("The value of a is %d\n"

"The value of *aPtr is %d\n\n", a, *aPtr);

printf ("Proving that * and & are complements of "

"each other.\n&*aPtr = %p\n*&aPtr = %p\n",

&*aPtr, *&aPtr);

The address of a is FFF4

The value of aPtr is FFF4

The value of a is 7

The value of *aPtr is 7

Proving that * and & are complements of each other.

&*aPtr = FFF4

*&aPtr = FFF4

The Other Format of Reference and Dereference Operators

FFF4

7

a

????

FFF4

aPtr

int a; /* a is an integer */

int *aPtr; /* aPtr is a pointer to an integer */

a = 7;

aPtr = &a; /* aPtr set to address of a */

The address of a is FFF4

The value of aPtr is FFF4

The value of a is 7

The value of *aPtr is 7

Proving that * and & are complements of each other.

&*aPtr = FFF4

*&aPtr = FFF4


Summary of pointer process

variable2

variable1

d

----

1906

Summary of Pointer Process

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

type *pt_name;

pt_name

แสดงตำแหน่งข้อมูลด้วย “&”

1906

----

แสดงข้อมูลด้วย “*”

d

variable2 = *pt_name;


Outline1

Outline

1

Pointer

2

Arithmetic & Pointer Operator

p

3

Array of Pointer& Array-Pointer Relate

Pointer to Pointer & Pointer to Structure

4

5

Assignment


Arithmetic pointer operator

Arithmetic & Pointer Operator

  • คณิตศาสตร์ของตัวแปรชี้ตำแหน่งสามารถทำได้เพียงการบวก การลบ การเพิ่มค่าและการลดค่าเท่านั้น ไม่สามารถกระทำการคูณ หาร หรือการเลื่อนบิทเครื่องหมายทางคณิตศาสตร์ของพอยน์เตอร์ได้แก่

    • + หมายถึง การบวก

    • – หมายถึง การลบ

    • ++ หมายถึง การเพิ่มค่าครั้งละ 1

    • –- หมายถึง การลดค่าครั้งละ 1


Arithmetic pointer operator cont

Arithmetic & Pointer Operator (cont.)

  • เครื่องหมาย “+” และ “–” ใช้ได้เฉพาะตัวแปรชี้ตำแหน่งชนิดเลขจำนวนเต็มเท่านั้น

  • การบวกและลบตัวแปรชี้ตำแหน่งคือ การเลื่อนไปชี้ในตำแหน่งที่อยู่ของตัวแปรตามที่กำหนด กรณีที่ตัวแปร ipชี้ที่ตำแหน่ง 1000 เมื่อทำคำสั่งต่อไปนี้

    int *ip;

    ip = &x;

    ip=ip+9;

    ค่าตัวแปรพอยน์เตอร์ “ip” จะเลื่อนไปชี้ที่ตำแหน่ง “1018”


Arithmetic pointer operator cont1

Arithmetic & Pointer Operator (cont.)

  • การเพิ่มค่าครั้งละ 1 ของตัวแปรตัวชี้จะเป็นการเลื่อนตัวชี้พอยน์เตอร์ตามชนิดของตัวแปรที่ทำการชี้ เช่น พอยน์เตอร์ “ip” ชี้ตัวแปรประเภทจำนวนเต็มที่ตำแหน่ง “1000” เมื่อกำหนด

    ip++;

    คอมไพเลอร์จะทำการเลื่อนตัวชี้ “ip” ไปยังตำแหน่ง “1002” เพราะจำนวนเต็มเก็บ 2 ไบท์

    int *ip;

    char *cp;

    float *fp;

fp

fp+1

ip

ip+1

ip+2

1000

1001

1002

1003

1004

1005

1006

1007

ตำแหน่งที่อยู่

cp+6

cp+7

cp

cp+1

cp+2

cp+3

cp+4

cp+5


Arithmetic pointer operator cont2

Arithmetic & Pointer Operator (cont.)

  • นอกจากการกระทำทางคณิตศาสตร์ ตัวชี้ยังมีความสามารถทางตรรกะ(เปรียบเทียบกันได้) เช่นเดียวกันกับตัวแปรปกติ

    1. == หมายถึง ตำแหน่งเดียวกัน

    2. != หมายถึง ต่างตำแหน่งกัน

    3. > หมายถึง ตำแหน่งสูงกว่า

    4. >= หมายถึง ตำแหน่งสูงกว่าหรือเท่ากัน

    5. < หมายถึง ตำแหน่งต่ำกว่า

    6. <= หมายถึง ตำแหน่งต่ำกว่าหรือเท่ากัน

    เช่น &x[3] จะน้อยกว่า &x[5] เป็นต้น


Outline2

Outline

1

Pointer

2

Arithmetic & Pointer Operator

p

3

Array of Pointer& Array-Pointer Relate

Pointer to Pointer & Pointer to Structure

4

5

Assignment


Pointer array

Pointer & Array

  • ตัวชี้และอาร์เรย์มีความสัมพันธ์กันอย่างมาก บ่อยครั้งมีการจัดการกับสมาชิกของอะเรย์โดยใช้ตัวแปรพอยน์เตอร์

    เช่น กำหนดให้ x[10] แล้วทำลำดับต่อไปนี้

    ip = &x[0];// ip = x;

    y = *ip;// เป็นการนำค่าที่ x[0] ส่งให้ตัวแปร y

    ที่ตำแหน่งใดๆสามารถอ้างได้โดยใช้พอยน์เตอร์บวกตัวชี้ตำแหน่ง

    ++ip; // (++ip)

    y = *ip;// เป็นการนำค่าที่ x[1] ส่งให้ตัวแปร y


Array pointer relate

Array-Pointer Relate

  • การนำตัวชี้อ้าง

    ตำแหน่งอาเรย์ต่างๆ (Array Pointer)

พอยน์เตอร์

ตำแหน่งอาเรย์

X[0]

ip

X[1]

ip+1

X[]={1,2,3,4,5,6}

*(ip+4)= ?

X[2]

ip+2

X[3]

ip+3

X[4]

ip+4

X[5]

ip+5


Array pointer relate cont

3000

3004

3008

300C

3010

v[0]

v[1]

v[2]

v[3]

v[4]

Array-Pointer Relate (cont.)

ตัวชี้และแถวลำดับในภาษาซีนั้น มีความใกล้ชิดกันอย่างมาก การประกาศ

float v[5]

เป็นการกำหนดแถวลำดับ vขนาด5นั่นคือกลุ่มของวัตถุติดกัน 5ชิ้นมีชื่อว่า v[0], v[1], v[2], v[3], v[4]


Array pointer relate cont1

3000

3004

3008

300C

3010

v[0]

v[1]

v[2]

v[3]

v[4]

vPtr

Array-Pointer Relate (cont.)

การประกาศfloat *vPtrและกำหนดให้ vPtrชี้ไปยังตัวแปรแถวลำดับvสามารถทำได้สองวิธีคือ

วิธีที่ 1

vPtr = v;

วิธีที่ 2

vPtr = &v[0];


Array pointer relate cont2

3000

3004

3008

300C

3010

v[0]

v[1]

v[2]

v[3]

v[4]

vPtr

Array-Pointer Relate (cont.)

การกำหนดx = *vPtrคือการสำเนาค่าใน v[0] มายังx


Moving pointer array with and

3000

3004

3008

300C

3010

v[0]

v[1]

v[2]

v[3]

v[4]

vPtr

Moving Pointer Array with “+=“ and “-=“

  • เมื่อบวกหรือลบจำนวนเต็มกับตัวชี้แล้ว

    • ค่าของตัวชี้มิได้เพิ่มหรือลดลงตามตัวเลขจำนวนนั้น

    • ค่าของตัวชี้เพิ่มหรือลดตามตัวเลขจำนวนนั้นคูณกับขนาดของวัตถุที่ตัวชี้นั้นชี้อยู่

    • ขนาด (ไบท์) ขึ้นกับประเภทของข้อมูลที่ใช้ในวัตถุนั้น

  • ตัวอย่าง(กำหนดขนาดของวัตถุชนิด float คือ 4 ไบท์)

    • vPtr += 2;// vPtr = vPtr+(2*4)// or vPtr = 3000+(2*4)


Moving pointer array with and cont

3000

3004

3008

300C

3010

v[0]

v[1]

v[2]

v[3]

v[4]

vPtr

3000

3004

3008

300C

3010

v[0]

v[1]

v[2]

v[3]

v[4]

vPtr

Moving Pointer Array with “+=“ and “-=“ (cont.)

  • vPtr += 2;// vPtr = vPtr+(2*4)// or vPtr = 3000+(2*4)

  • หลังจากคำสั่งข้างต้นแล้ว vPtrจะชี้ไปที่ v[2]


Moving pointer array with and cont1

3000

3004

3008

3012

3016

v[0]

v[1]

v[2]

v[3]

v[4]

vPtr

3000

3004

3008

3012

3016

v[0]

v[1]

v[2]

v[3]

v[4]

vPtr

Moving Pointer Array with “+=“ and “-=“ (cont.)

  • vPtr -= 2;// vPtr = vPtr-(2*4)// or vPtr = 3008-(2*4)

  • หลังจากคำสั่งข้างต้นแล้วvPtrจะชี้ไปที่ v[0]


Moving pointer array with and1

Moving Pointer Array with “+“ and “-“

3000

3004

3008

300C

3010

v[0]

v[1]

v[2]

v[3]

v[4]

vPtr

vPtr+2

vPtr+4

vPtr+1

vPtr+3


Calculation element by pointer

Calculation Element by Pointer

3000

3004

3008

300C

3010

v[0]

v[1]

v[2]

v[3]

v[4]

vPtr

v2Ptr

  • vPtr = &v[0];// vPtr = 3000

  • v2Ptr = &v[2];// or v2Ptr = 3008

  • x = v2Ptr – vPtr; // x = ?

ค่าที่ xได้รับคือจำนวนหน่วย (Element) ของตัวแปรแถวลำดับนับจาก vPtrถึงvPtr2 ในกรณีนี้คือ 2


Using pointer with array

num[3]

num[4]

num[0]

num[1]

num[2]

12

34

907

112

45

0410

0414

0412

0418

0416

pt_num

0350

temp

050A

Using Pointer with Array

intnum[5] = {12, 34, 112, 45, 907};

int*pt_num;

pt_num = &num[1];

0412

0418

pt_num = &num[4];

inttemp;

temp = *pt_num;

907


Using pointer with array cont

num[0]

num[1]

num[4]

num[2]

num[3]

26.09

-4.24

-4.23

19.01

-13.12

0310

0300

0304

0308

030C

Using Pointer with Array (cont.)

typename[10];

type*pt_name;

pt_name = name;//pt_name = &name[0]

floatnum[] = {19.01, 26.09, -4.23, -4.24, -13.12}


The other using pointer with array

pt_num

+3

090D

+1

test1

test2

num[3]

num[2]

num[4]

num[1]

num[0]

26.09

-13.12

19.01

-4.23

-4.24

032A

322E

0308

0300

030C

0310

0304

The Other Using Pointer with Array

float *pt_num;

0300

pt_num = num;

float test1, test2;

test1 = *(pt_num+3);

-4.24

26.09

test2 = *(pt_num+1);


Array of pointer

Array of Pointer

Type*Pointer_Array_Name[index];

typeคือชนิดของตัวแปรประเภทตัวชี้ตามข้อกำหนดของ Array

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

Pointer_Array_nameคือชื่อชุดของตัวแปรประเภทตัวชี้

indexคือ ขนาดของอาเรย์ที่จองไว้สำหรับเก็บชุดของตัว แปรประเภทตัวชี้


Example 3

Example 3

#include<stdio.h>

void main(void)

{

int a, b, c, *pa[3];

a=5; b=10; c=15;

pa[0]=&a; pa[1]=&b; pa[2]=&c;

printf(“\n pa 1=%d, 2=%d, 3=%d”,*pa[0],*pa[1],*pa[2]);

}


Array

Array

int main()

{

int i, offset, b[] = {10, 20, 30, 40};

int *bPtr = b; /* set bPtr to point to array b */

printf("Array b printed with:\n"

"Array subscript notation\n");

for (i=0; i<=3; i++)

printf("b[%d] = %d\n", i, b[i]);

return 0;

}

Array b printed with:

Array subscript notation

b[0] = 10

b[1] = 20

b[2] = 30

b[3] = 40


Using array in pointer format

Using Array in Pointer Format

int main()

{

int i, offset, b[] = {10, 20, 30, 40};

int *bPtr = b; /* set bPtr to point to array b */

printf("Pointer/offset notation where\n"

"the pointer is the array name\n");

for (offset = 0; offset<=3 ; offset++)

printf("*(b + %d) = %d\n", offset, *(b + offset));

return 0;

}

Pointer/offset notation where

The pointer is the array name

*(b + 0) = 10

*(b + 1) = 20

*(b + 2) = 30

*(b + 3) = 40


Using pointer in array format

Using Pointer in Array Format

int main()

{

int i, offset, b[] = {10, 20, 30, 40};

int *bPtr = b; /* set bPtr to point to array b */

printf("Pointer subscript notation\n");

for (i=0 ; i<=3 ; i++)

printf("bPtr[%d] = %d\n", i, bPtr[i]);

return 0;

}

Pointer subscript notation

bPtr[0] = 10

bPtr[1] = 20

bPtr[2] = 30

bPtr[3] = 40


Outline3

Outline

1

Pointer

2

Arithmetic & Pointer Operator

p

3

Array of Pointer& Array-Pointer Relate

Pointer to Pointer & Pointer to Structure

4

5

Assignment


Pointer to pointer

Pointer to Pointer

type **ptt_name;

typeคือชนิดของตัวแปรประเภทตัวชี้

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

ซ้อนตัวชี้

ptt_nameคือชื่อตัวแปรประเภทตัวชี้ซ้อนตัวชี้


Pointer to pointer cont

ptt_time

pt_time

temp2

temp1

time

9.28

05C0

03AA

0510

0100

0250

Pointer to Pointer (cont.)

floattime = 9.28;

float*pt_time;

0100

0250

float**ptt_time;

pt_time = &time;

ptt_time = &pt_time;

floattemp1;

temp1 = *pt_time;

9.28

floattemp2;

temp2 = **ptt_time;

9.28


Example 4

Example 4

#include<stdio.h>

int main(void)

{

char **ptr = NULL;

char *p = NULL;

char c = 'd';

p = &c;

ptr = &p;

printf("\n c = [%c]\n",c);

printf("\n *p = [%c]\n",*p);

printf("\n **ptr = [%c]\n",**ptr);

return 0;

}


Structure pointer

Structure & Pointer

struct student{

char name[40];

int age ;

};

struct student s;

struct student *sPtr;

strcpy(s.name,“Somsak”);

s.age = 19;

sPtr = &s;

s

sPtr

s.name

s.age

Somsak\0

19

xxxx

xxxx

  • หากต้องการพิมพ์ว่าชื่อนักศึกษา สามารถทำได้สองวิธีคือ

  • printf("%s", s.name);

  • printf("%s", sPtr->name);


Structure pointer cont

Queen\0

mmmm

Structure & Pointer (cont.)

struct card {

char *face;

char *suit;

};

struct card a;

struct card *aPtr;

a.face = “Queen”;

a.suit = “heart”;

heart\0

aPtr = &a;

nnnn

aPtr

a

a.face

a.suit

mmmm

nnnn

xxxx

xxxx

  • หากต้องการพิมพ์ว่าไพ่ใบนี้อยู่ในชุดไหน สามารถทำได้สองวิธีคือ

  • printf("%s", a.suit);

  • printf("%s", aPtr->suit);


Example 5

Example 5

int main(){

struct card {

char *face;// 2,3,..,9,J,Q,K,A

char *suit; // space, heart, diamond, club

};

struct card a; struct card *aPtr;

a.face= “Ace"; a.suit = “spade"; aPtr = &a;

printf( "%s%s%s\n%s%s%s\n%s%s%s\n",

a.face , " of " ,a.suit,

aPtr->face , " of " , aPtr->suit,

(*aPtr).face, " of " , (*aPtr).suit );

return 0;

}

aPtr

xxxx

yyyy

mmmm

nnnn

Ace\0

space\0

Ace of spade

Ace of spade

Ace of spade

a

a.face

a.suit

mmmm

nnnn

yyyy

xxxx


Example 6

Example 6

#include <stdio.h>

#include <conio.h>

int main() {

structst {

int id;

char *name;

char *address;

};

structst employee, *stptr;

stptr = &employee;

stptr->id = 1;

stptr->name = "Angelina";

stptr->address ="Rohini,Delhi";

printf("Employee Information: id=%d\n%s\n%s\n", stptr->id, stptr->name,stptr->address);

printf("Employee Information: id=%d\n%s\n%s\n", employee.id, employee.name, employee.address);

return 0;

}


Example 7

Example 7

  • จงเขียนโปรแกรมเก็บข้อมูลนักศึกษาจำนวน 10 คนโดยมีรายละเอียดดังนี้

    • ข้อมูลประกอบด้วยชื่อกับอายุ

    • รับข้อมูลนักศึกษาจากคีย์บอร์ด

    • โปรแกรมจะต้องใช้ตัวชี้ที่ชี้ไปยังข้อมูลประเภทโครงสร้าง

    • เมื่อป้อนข้อมูลเสร็จโปรแกรมจะค้นหานักเรียนที่อายุมากกว่า 20 ปีแสดงชื่อออกจอภาพ


Output

Output

Student[6]

name:tu

age:25

Student[7]

name:tee

age:34

Student[8]

name:bat

age:44

Student[9]

name:phon

age:33

jo,23

pat,21

tu,25

tee,34

bat,44

phon,33

Student[0]

name:joy

age:12

Student[1]

name:boy

age:20

Student[2]

name:jo

age:23

Student[3]

name:pat

age:21

Student[4]

name:ple

age:13

Student[5]

name:tom

age:11


Example 7 cont

Example 7 (cont.)

#include<stdio.h>

#include<conio.h>

int main()

{

struct profile{

char name[20];

int age;

} s[10];

inti;

structprofile *sPtr;

sPtr= s;


Example 7 cont1

Example 7 (cont.)

for (i=0; i<10; i++)

{

printf("Student # %d\n\tName :", i+1 );

scanf("%s",sPtr->name);

printf("\tAge:");

scanf("%d",&(sPtr->age));

sPtr++;

}

sPtr -= 10;

for (i=0; i<10; i++)

{

if ((sPtr->age) > 20)

printf("\n%s, %d",sPtr->name,sPtr->age);

sPtr++;

}

return 0;

}


Structure programming

Example 7 (Pointer Form)

#include<stdio.h>

typedefstruct telephone

{

char *name;

intnumber;

}TELEPHONE;

intmain()

{

TELEPHONE index;

TELEPHONE *ptr_myindex;

ptr_myindex= &index;

ptr_myindex->name = "Jane Doe";

ptr_myindex->number = 12345;

printf("Name: %s\n", ptr_myindex->name);

printf("Telephone number: %d\n", ptr_myindex->number);

return 0;

}


Structure programming

Example 7 (Pointer Form)

#include<stdio.h>

typedefstruct telephone

{

char *name;

intnumber;

}TELEPHONE;

intmain()

{

TELEPHONE index;

TELEPHONE *ptr_myindex;

ptr_myindex= &index;

ptr_myindex->name = "Jane Doe";

ptr_myindex->number = 12345;

printf("Name: %s\n", ptr_myindex->name);

printf("Telephone number: %d\n", ptr_myindex->number);

return 0;

}


Dynamic memory allocation

Dynamic Memory Allocation

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

คำสั่งเบื้องต้นที่เกี่ยวข้อง (Librayชื่อ <stdlib.h>)

void* malloc(size_of_memory)

malloc - เป็นฟังก์ชันในการร้องขอหน่วยความจำแบบ dynamic โดยหากสามารถจองพื้นที่ในหน่วยความจำได้ จะได้ค่าส่งกลับมาเป็น ตำแหน่งของหน่วยความจำ (void*) แต่ถ้าไม่สามารถจองได้จะให้ค่าเป็นNULL กลับคืนมา

size_of_memory –ขนาดของหน่วยความจำที่ต้องการเป็นจำนวนไบต์

*NULL เป็นค่าของตำแหน่งว่าง


Dynamic memory allocation1

Dynamic Memory Allocation

คำสั่งเบื้องต้นที่เกี่ยวข้อง

void free(ptr)

free – เป็นฟังก์ชันในการคืนหน่วยความจำที่ไม่ได้ใช้งาน

ptr – ตำแหน่งของหน่วยความจำที่จะคืน


Example

Example


Example1

Example


Structure programming

One-dimensional arrays

#include <stdio.h>

#include <stdlib.h>

intmain(void)

{

inti;

int* i_array; // this will be the array

intj;

// find out how many integers are required

printf("How many integers? ");

scanf("%d",&i);

// Now allocate memory space

i_array= (int*)malloc(i*sizeof(int)); // allocate storage for the array

// code that uses the new array

for (j=0;j<i;j++)

{ i_array[j]=j; // the pointer can be used as an array

printf("%d\n",i_array[j]);

}

free((void*) i_array); // free up memory for reuse.

system("pause");

return 0;

}


Structure programming

Multi-dimensional arrays

#include <stdio.h>

#include <stdlib.h>

intmain(void)

{

inti,nrows,ncols;

// Define the size of the array at run time

printf("Enter number of rows and number of columns "); scanf("%d %d",&nrows,&ncols);

int** array; array=(int**)malloc(nrows*sizeof(int*));

for (i=0; i<nrows; i++) array[i]=(int*)malloc(ncols*sizeof(int));

func(array, nrows, ncols); // some function that uses the array ....

for (i=0; i<nrows; i++)

free((void*)array[i]);

free((void*)array);

system("pause");

return 0;

}


Outline4

Outline

1

Pointer

2

Arithmetic & Pointer Operator

p

3

Array of Pointer& Array-Pointer Relate

Pointer to Pointer & Pointer to Structure

4

5

Assignment


Assignment class

Assignment (Class)

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

1. มีเมนูสำหรับการจองพื้นที่ในการเก็บข้อมูลสำหรับ node ใหม่ ซึ่งเมื่อเลือกแล้วจะรอรับข้อมูลที่จะเก็บ

2. เชื่อมข้อมูลตามลำดับ node ที่ป้อนข้อมูลเข้ามา

3. มีเมนูสำหรับการแสดงผลข้อมูล โดยแสดงตำแหน่งปัจจุบัน ข้อมูลในตำแหน่งนั้น และ ตำแหน่งถัดไปของข้อมูล

4. มีเมนูออกจากโปรแกรม โดยนิสิตจะต้องทำการคืนหน่วยความจำกลับคืนก่อนที่จะออกจากโปรแกรมด้วย


  • Login