Recommended
PPT
PDF
PPTX
ตัวแปรพื้นฐานเขียนโปรแกรม
PDF
PDF
เครื่องหมายและการดำเนินการในภาษาซี
PDF
บทที่1 พื้นฐานโปรแกรมภาษาซี
PDF
PDF
PDF
PDF
แนะนำการเขียนโปรแกรมภาษาแอสเซมลีเบื้องต้น
DOC
การเขียนคำสั่งควบคุมขั้นพื้นฐาน
PDF
PDF
DOC
PDF
PDF
PDF
การเขียนคำสั่งขั้นพื้นฐาน(ภาษาC)
PPT
PDF
PPTX
การเขียนคำสั่งควบคุมแบบมีทางเลือก.
PPTX
ตัวแปร ชนิดข้อมูล ตัวดำเนินการ นิพจน์ และค่าคงที่
PDF
PDF
PDF
กลุ่ม3การเขียนคำสั่งควบคุมแบบมีทางเลือก
PDF
PDF
PDF
PDF
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
PPT
The rabbits / Presentacion de los conejos en ingles
KEY
More Related Content
PPT
PDF
PPTX
ตัวแปรพื้นฐานเขียนโปรแกรม
PDF
PDF
เครื่องหมายและการดำเนินการในภาษาซี
PDF
บทที่1 พื้นฐานโปรแกรมภาษาซี
PDF
PDF
What's hot
PDF
PDF
แนะนำการเขียนโปรแกรมภาษาแอสเซมลีเบื้องต้น
DOC
การเขียนคำสั่งควบคุมขั้นพื้นฐาน
PDF
PDF
DOC
PDF
PDF
PDF
การเขียนคำสั่งขั้นพื้นฐาน(ภาษาC)
PPT
PDF
PPTX
การเขียนคำสั่งควบคุมแบบมีทางเลือก.
PPTX
ตัวแปร ชนิดข้อมูล ตัวดำเนินการ นิพจน์ และค่าคงที่
PDF
PDF
PDF
กลุ่ม3การเขียนคำสั่งควบคุมแบบมีทางเลือก
PDF
PDF
PDF
PDF
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
Viewers also liked
PPT
The rabbits / Presentacion de los conejos en ingles
KEY
PPTX
las ocho regiones naturales del perù
DOCX
PDF
PDF
Principles and challenges in scaling up CLTS – Experiences from Madhya Prades...
PPTX
DOCX
PPTX
PPT
PDF
Redefining the Face of STEM in Space
PDF
Randall Whittinghill: Repurposed Art
PDF
PPT
Halloween - Noche de brujas
PPTX
Use of derivative tools in alm
PPTX
Community-Led Total Sanitation (CLTS)
PDF
Randall Whittinghill: Puppies
PDF
Similar to โปรแกรม ภาษาซี
PPT
การเขียนคำสั่งควบคุมแบบมีทางเลือก กลุ่ม 3
DOC
DOC
DOC
DOC
PDF
PDF
PPT
PPT
PPT
PPT
PDF
PDF
PDF
PDF
โครงสร้างของโปรแกรมภาษาซี
PPT
PPT
PDF
PDF
PPT
โปรแกรม ภาษาซี 1. 2. 3. 3
# header
ส่วนที่ 1
main( )
{ /* เริ่มโปรแกรม */
declaration ส่วนที่ 2
………
คำาสั่งต่าง ๆ
ส่วนที่ 3
}
2. โครงสร้างพื้นฐาน
ของภาษาซี
2. โครงสร้างพื้นฐาน
ของภาษาซี
4. 5. 5
ส่วนที่ 2 declaration เป็นการกำาหนดชนิด
ข้อมูลที่จะใช้ใน
โปรแกรมซึ่งตัวแปรหรือข้อมูลต่าง ๆ
นั้นจะต้องถูก
ประกาศ(declare) ในส่วนนี้ก่อน จึง
จะสามารถนำาไปใช้
ในโปรแกรมได้ เช่น
int stdno;
เป็นการกำาหนดว่าตัวแปร stdno เป็น
ข้อมูลชนิดจำานวนเต็ม
หรือ interger ซึ่งอาจได้แก่ค่า 0,4,-
1,-3,…. เป็นต้น
6. 6
ody คือส่วนของตัวโปรแกรม โดยจะต้องเริ่มต้นด้ว
main ( ) แล้วใส่เครื่องหมายกำาหนดขอบเขตเริ่มต้นข
ปรแกรมคือ { หลังจากนั้นใส่คำาสั่งหรือฟังก์ชันต่าง
ะคำาสั่งหรือฟังก์ชันนั้น ๆ จะต้องปิดด้วยเครื่องหมาย
มื่อต้องการจบโปรแกรมให้ใส่เครื่องหมาย } ปิดท้าย
main ( )
{ /* เริ่มต้นโปรแกรม */
คำาสั่งต่าง ๆ ;
ฟังก์ชัน;
……………
…………...
} /* จบโปรแกรม */
7. 7
เครื่องหมายต่าง ๆ
{ } - เป็นตัวกำาหนดขอบเขตหรือบล็อก
ของฟังก์ชัน
( ) - เป็นการระบุตัวผ่านค่าหรือ
อาร์กิวเมนต์ให้กับฟังก์ชัน
ถ้าภายในวงเล็บไม่มีข้อความใด
ๆ แสดงว่าไม่มีตัวผ่าน
ค่าที่ต้องการระบุสำาหรับฟังก์ชัน
นั้น ๆ
/* */ - เป็นการกำาหนด comment หรือ
8. 8
# include <stdio.h>
int main (void )
{
printf(“Hello, Good morning. n”);
}
ตัวอย่างโปรแกรม
โปรแกรมที่ 1
เป็นโปรแกรมสั่งพิมพ์ข้อความ Hello, Good morning
9. 9
โปรแกรมที่ 2
# include <stdio.h>
main ( )
{
float point;
printf("nnPut your score
inn");
scanf("%f", &point);
printf("Your score is %f
pointnn", point);
}
เป็นโปรแกรมรับคะแนนและเก็บค่าที่ตัวแปร poi
หลังจากนั้นสั่งให้มีการพิมพ์คะแนนออกมา
10. 11. 12. 12
ชนิดข้อมูล ( )เนื้อที่สำาหรับเก็บไบต์ ค่าตัวเลขที่เก็บ
Char 1 เก็บตัวอักษรASCII 1 0 255ได้ ตัวหรือจำานวนเต็มระหว่าง ถึง
Int 2 –32768 32767ค่าตัวเลขระหว่าง ถึง
Short 2 –32768 32767ค่าตัวเลขระหว่าง ถึง
Long 4 ค่าตัวเลขประมาณ±2000ล้าน
Unsigned Unsignedshort=2
Unsignedlong=4
0 65535ค่าตัวเลขระหว่าง ถึง
0 4000ค่าตัวเลขระหว่าง ถึง ล้าน
Float 4 10ได้ค่าตัวเลขยกกำาลัง x
โดยx –37 +38มีค่าระหว่าง ถึง
Double 8 ความถูกต้องของตัวเลขจะมีค่าสูงขึ้น
เนื้อที่ในหน่วยความจำาและค่าตัวเลขที่เก็บของข้อม
13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 22
ฟังก์ชัน printf( ) และ scanf( )
รูปแบบของ printf ( )
printf( ส่วนควบคุมการพิมพ์,
อาร์กิวเมนต์, อาร์กิวเมนต์,...)
ส่วนควบคุมการพิมพ์ เป็นสตริงที่มี
ข้อความและรูปแบบของการพิมพ์โดยอยู่
“ ”ในเครื่องหมาย
อาร์กิวเมนต์ เป็นส่วนที่จะนำาข้อมูลมา
พิมพ์ ตามรูปแบบที่กำาหนดมาในส่วน
23. 24. 25. 25
รูปแบบของ scanf ( )
scanf( ส่วนควบคุมข้อมูล, อาร์กิวเมนต์,
อาร์กิวเมนต์,...)
ส่วนควบคุมข้อมูล เป็นการกำาหนดรูปแบบข้อมูลใน
“ ”เครื่องหมาย
อาร์กิวเมนต์ เป็นส่วนที่จะนำาข้อมูลมาเก็บ(ใน
ตัวแปร) ซึ่งชนิดของข้อมูลต้องตรงตามรูปแบบที่
กำาหนดในส่วนควบคุมข้อมูล
การกำาหนดลักษณะอาร์กิวเมนต์มีได้ 2 แบบดังนี้
ถ้าข้อมูลนั้นอาจจะนำาไปใช้ในการคำานวณ
- จะใส่เครื่องหมาย & หน้าตัวแปร
ถ้าข้อมูลนั้นเป็นข้อความที่จะนำาไปเก็บไว้ใน
26. 27. 28. 29. 30. 30
กต่างของเครื่องหมาย = และ ==
ครื่องหมาย = เป็นตัวกำาหนดค่า
เครื่องหมาย == เป็นเครื่องหมายเปรียบเทียบ ตัวอย
44;
ง เป็นการกำาหนดค่าให้กับตัวแปร point ให้มีค่าเท
= 44;
ง เป็นการตรวจสอบว่าค่า point มีค่าเท่ากับ 44 หรือ
31. 31
หมายและนิพจน์เปรียบเทียบแบบตรรกศ
&& และ (and)
| | หรือ (or)
! ไม่ (not)
นิพจน์เปรียบเทียบเชิงตรรก
ที่ 1 && นิพจน์ที่ 2 เป็นจริง เมื่อนิพจน์ทั้งสองเป็น
ที่ 1 | | นิพจน์ที่ 2 เป็นจริง เมื่อนิพจน์ใดนิพจน์ห
เป็นจริงหรือ ทั้งสองนิพจน์นั้นเป็นจริง
น์เปรียบเทียบ เป็นจริง เมื่อนิพจน์เปรียบเทียบ
32. 33. 33
สั่ง if ….. else …..
รูปแบบของคำาสั่ง
if (คำาสั่งหรือนิพจน์เงื่อนไข)
คำาสั่งที่ต้องทำาเมื่อเงื่อนไขนั้นเป็นจ
else คำาสั่งที่ต้องทำาเมื่อเงื่อนไขนั้นไม่เป็น
งเช่น
if (value1 > value2)
min = value2;
else
min = value1;
34. 35. 36. 37. 38. 39. 39
คำาสั่งลูป for
รูปแบบ
for ( นิพจน์ที่ 1 ; นิพจน์ที่ 2 ;
นิพจน์ที่ 3 )
{
คำาสั่งวนรอบ;
…….
}
เป็นคำาสั่งที่ใช้ในการควบคุมให้มีการวน
รอบคำาสั่งหลาย ๆ รอบ
โดยนิพจน์ที่ 1 คือการกำาหนดค่าเริ่มต้นให้กับ
ตัวแปรที่ใช้ในการวนรอบ
นิพจน์ที่ 2 เป็นการเปรียบเทียบ ก่อนที่จะวน
40. 41. 41
คำาสั่งควบคุมอื่น ๆ break, continue, goto และ labelsคำาสั่งควบคุมอื่น ๆ break, continue, goto และ labels
reak
อต้องการให้การทำางานสามารถหลุดออกจากลูปแล
งที่อยู่นอกลูปทันที โดยไม่ต้องตรวจสอบเงื่อนไขใ
ontinue
มื่อต้องการให้การทำางานนั้น ย้อนกลับไปวนรอบให
ณะที่ตรงข้ามกับคำาสั่ง break
42. 42
oto และ labels
o ประกอบด้วย 2 ส่วน คือ
goto เป็นคำาสั่งให้กระโดดไปยังตำาแหน่งที่กำาหนด
าหนดเป็นชื่อ เรียกว่า label name
el name) เป็นตัวกำาหนดตำาแหน่งที่คำาสั่งจะกระโดด
น
ง ! คำาสั่งนี้ถือเป็นคำาสั่งที่ควรหลีกเลี่ยงในการเขียน
นหรือหลีกเลี่ยงไม่ได้เท่านั้น จึงจะใช้คำาสั่งนี้
43. 44. 45. 46. 46
รับข้อมูล 2 จำำนวน
จำกผู้ใช้บวกเลข 2 จำำนวนแล้ว
เก็บผลลัพธ์แสดงผลลัพธ์ของ
กำรทำำงำน
โปรแกรมเพื่อบวกเลขสอง
จำำนวนที่รับจำกผู้ใช้ และแสดง
ผลกำรคำำนวณ
ตัวอ
ย่ำง
สำมำรถแบ่งกำรทำำงำนเป็นงำนย่อยได้ด
47. 48. 49. 50. 51. 52. 53. 54. 55. 55
จำกตัวอย่ำงที่ 4.1 จะเห็นว่ำ
ฟังก์ชัน main ( ) จะอยู่ใต้ฟังก์ชัน
อื่น ๆ ที่มีกำรเรียกใช้ เป็นลักษณะ
ที่ต้องประกำศฟังก์ชันที่ต้องกำร
เรียกใช้ก่อนจำกเรียกใช้ฟังก์ชัน
นั้น แต่หำกต้องกำรย้ำยฟังก์ชัน
main ( ) ขึ้นไปไว้ด้ำนบน จะต้องมี
กำรประกำศโปรโตไทป์ของฟังก์ชัน
ที่ต้องกำรเรียกใช้ก่อนเสมอ
56. 56
#include <stdio.h>
double InputDouble ( );
double SumDouble
( double , double );
void PrintOut ( double );
ตัวอย่ำง
4.2
แสดงกำรทำำงำนของ
โปรแกรมกำรบวก
เลขจำำนวนจริง 2 จำำนวน
ที่รับจำกผู้ใช้ ในลักษณะ
ที่มีกำรประกำศโปรโต
ไทป์
57. 57
void main ( )
{
double a1, a2, sumVal;
a1 = InputDouble( );
a2 = InputDouble( );
sumVal = SumDouble (
a1, a2 );
PrintOut ( sumVal );
}
ตัวอย่ำง
4.2 (ต่อ)
58. 59. 60. 60
a1 =a1 =
InputDouble ( );InputDouble ( );
ใช้คู่กับโปรโต
ไทป์
doubledouble
InputDouble ( );InputDouble ( );
ตัวอ
ย่ำงa1 ต้องมีชนิดเป็น double เนื่องจำกค่ำที่จ
คืนกลับมำจำกฟังก์ชันมีชนิดเป็น doub
61. 61
sumVal =sumVal =
SumDouble (a1,a2 );SumDouble (a1,a2 );
ใช้คู่กับโปรโตไทป์
double InputDoubledouble InputDouble
( );( );
ตัวอ
ย่ำง
a1 และ a2 ต้องมีชนิดเป็น double
เพื่อให้ตรงกับชนิดตัวแปรของอำร์กิวเม
ที่ประกำศในโปรโตไทป์
62. 62
PrintOut( sumVal )PrintOut( sumVal )
;;
ใช้คู่กับโปรโต
ไทป์
void PrintOutvoid PrintOut
( double );( double );
ตัวอ
ย่ำง
ประกำศให้รู้ว่ำฟังก์ชันนี้ไม่มีกำรคืนค่ำ
63. 64. 65. 66. 67. 68. 69. 70. 71. 71
#include <stdio.h>
int x;
void func1 ( )
{
x = x + 10;
printf ( “func1 -> x :
%dn”, x );
}
ตัวอย่ำง
4.3
แสดงกำรทำำงำนของ
โปรแกรมในลักษณะที่มี
ตัวแปรโกลบอล แสดง
ขอบเขตกำรใช้งำนของ
ตัวแปรภำยในโปรแกรม
72. 72
void func2 ( int x )
{
x = x + 10;
printf ( “func2 -> x :
%dn”, x );
}
void func3 ( ) {
int x=0;
x = x + 10;
printf ( “func3 -> x :
%dn”, x );
ตัวอย่ำง
4.3 (ต่อ)
73. 73
void main ( )
{
x = 10;
printf ( “main (start) -> x :
%dn”, x );
func1 ( );
printf ( “main (after func1) ->
x : %dn”, x ); func2 ( x );
printf ( “main (after func2) ->
x : %dn”, x); func3 ( );
printf ( “main (after func3) ->
ตัวอย่ำง
4.3 (ต่อ)
74. 74
main (start) -> x : 10
func1 -> x : 20
main (after func1) -> x : 20
func2 -> x : 30
main (after func2) -> x : 20
func3 -> x : 10
main (after func3) -> x : 20
ตัวอย่ำง
4.3 (ต่อ) ผลกำรทำำงำน
75. 76. 77. 77
struct point {
int
x;
int
y;
};
กำรประกำศ ประเภทข้อมูลประเภทข้อมูล
แบบโครงสร้ำง
Mem
ber
หมำยเหตุ กำรประกำศชื่อสมำชิกภำยใน
struct จะใช้ชื่อใดก็ได้อำจจะซำ้ำกับชื่อ
ตัวแปรที่อยู่ภำยนอก struct แต่ชื่อที่อยู่
ภำยใน struct เดียวกันห้ำมประกำศชื่อซำ้ำ
78. 78
struct point {
int
x;
int
y;
} x, y , z;
กำรประกำศ ตัวแปรข้อมูลตัวแปรข้อมูล
แบบโครงสร้ำง
หมำยเหตุ จะเห็นว่ำชื่อของ struct จะ
ประกำศหรือไม่ก็ได้ หำกไม่มีกำร
ประกำศจะไม่สำมำรถนำำ struct นั้นกลับ
แบบที่ 1
79. 79
struct point {
int x;
int y;
};
struct point
x,y,z
แบบที่ 2 กำร
ประกำ
ศแบบ
ข้อมูล
โครงส
ร้ำงกำร
ประกำ
ศ
ตัวแปร
ข้อมูล
80. 80
struct point pt =
{320,200};
กำรกำำหนดค่ำเริ่มต้นให้กับตัวแปร
ข้อมูลแบบโครงสร้ำง
struct_name.membe
r
กำรอ้ำงถึงสมำชิกภำยในตัวแปร
ข้อมูลแบบโครงสร้ำง
81. 82. 82
หมำยเหตุ สมำชิกของข้อมูล
ประเภท struct อำจจะเป็นตัวแปร
ประเภทใดก็ได้ ทั้งข้อมูลพื้นฐำน
และประเภทข้อมูลอื่น ๆ เช่น อำเรย์
และยังประกำศ ตัวแปรของ
ข้อมูลประเภท struct ได้อีกด้วยตัวอย่
ำง
pt
2pt
1
หำกต้องกำร
เก็บข้อมูลของ
สี่เหลี่ยมดังรูป
สำมำรถทำำกำร
ประกำศ
83. 84. 85. 86. 87. 88. 88
กำรเรียกใช้งำนฟังก์ชัน
struct rect screen;
struct point middle;
struct point makepoint ( int, int );
screen.pt1 = makepoint ( 0, 0 );
screen.pt2 = makepoint ( XMAX,
YMAX );
middle = makepoint ((screen.pt1.x
+ screen.pt2.x) / 2,
(screen.pt1.y +
screen.pt2.y) / 2 );
89. 89
ตัวอย่ำ
ง 5.2
ฟังก์ชันกำรบวก x และ y ของ
จุด 2 จุด และคืนค่ำผลของกำร
บวกเป็น struct
struct point addpoint(struct point
p1, struct point p2)
{
p1.x += p2.x;
p1.y += p2.y;
return p1;
}
หมำยเหตุ ตัวอย่ำงนี้แสดงกำรส่งอำร์กิวเมนท์
แบบ struct ให้กับฟังก์ชัน
90. 90
ตัวอย่ำ
ง 5.3
ฟังก์ชันกำรหำว่ำจุดอยู่ในพื้นที่
สี่เหลี่ยมหรือไม่
int pinrect ( struct point p,
struct rect r )
{
return p.x >= r.pt1.x && p.x <
r.pt2.x &&
p.y >= r.pt1.y && p.y <
r.pt2.y;
}
หมำยเหตุ ตัวอย่ำงนี้เป็นกำรหำว่ำจุดที่ระบุ
อยู่ในพื้นที่สี่เหลี่ยมหรือไม่ โดยส่งค่ำจุด
และพื้นที่สี่เหลี่ยมเป็นอำกิวเมนท์ให้กับ
ฟังก์ชัน หำกจุดอยู่ในพื้นที่สี่เหลี่ยมจะคืน
ค่ำ1 แต่หำกจุดอยู่นอกพื้นที่สี่เหลี่ยมจะคืน
91. 92. 93. 94. 95. 95
int *ip;
เป็นการประกาศตัวแปร ip ให้เป็น
ตัวแปรพอยน์เตอร์ที่ชี้ไปยังตัวแปร
ประเภท int
double *dp,
atof(char *);
เป็นการประกาศตัวแปร dp เป็นตัว
แปรพอยน์เตอร์ที่ชี้ไปยังตัวแปร
ตัวอย่
าง
96. 97. 97
int x = 1, y = 2;
int *ip, *iq;
ip = &x;
y = *ip;
*ip = 0;
y = 5;
ip = &y;
*ip = 3;
iq = ip;
รูปที่ 6.3 การกำาหนดค่าและการอ่าน
ค่าตัวแปรตัวชี้
98. 99. 100. 101. 102. 103. 104. 105. 106. 106
6.4 ตัวชี้และอาร์กิวเมนท์ของ
ฟังก์ชัน
(Pointer and Function
Arguments)
เนื่องจากภาษาซีมีการส่งอากิวเมนต์
ให้กับฟังก์ชันแบบ By Value และ
ฟังก์ชันสามารถคืนค่า (return) ค่า
ได้เพียงหนึ่งค่า หากต้องการให้
ฟังก์ชันมีการเปลี่ยนแปลงค่าและคืน
ค่ากลับมายังฟังก์ชันที่เรียกใช้
มากกว่าหนึ่งค่าจะต้องนำาพอยน์
เตอร์เข้ามาช่วย
107. 107
ตัวอย่างเช่น หากต้องการเขียน
ฟังก์ชันเพื่อสลับค่าของตัวแปร 2 ตัว
ผลลัพธ์ที่ต้องการได้จากฟังก์ชันนี้จะ
มี 2 ค่าของตัวแปรที่ทำาการสลับค่า
หากอาร์กิวเมนต์เป็นตัวแปรธรรมดา
จะไม่สามารถแก้ปัญหานี้ได้ จึงต้อง
ใช้พอยน์เตอร์เข้ามาช่วย โดยการ
ส่งค่าแอดเดรสของตัวแปรทั้ง 2 ให้
กับฟังก์ชันที่จะสลับค่าของตัวแปรทั้ง
2 ผ่านทางตัวแปรพอยน์เตอร์ที่เป็น
108. 109. 109
void main ( )
{
int x = 5, y = 10;
printf(“Before swap : x =
%d”, x, “, y = %dn”, y);
swap ( &x, &y);
printf(“After swap : x = %d”,
x, “, y = %dn”, y);
}
ตัวอย่าง 6.1
(ต่อ)
110. 110
void swap (int *px, int
*py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
ตัวอย่าง 6.1
(ต่อ)
111. 112. 113. 113
6.5 ตัวชี้กับอาร์เรย์ (Pointer and
Arrays)
อาร์เรย์เป็นประเภทข้อมูลที่เก็บ
ชุดของข้อมูลประเภทเดียวกัน
มักใช้กับการทำางานที่ต้องทำางาน
กับตัวแปรชนิดเดียวกันหลายตัวที่
มีการทำางานเหมือนกัน เช่น
คะแนนของนักศึกษาภายในห้อง
20 คน เป็นต้น อาร์เรย์ในภาษาซี
จะนำาหลักการของพอยน์เตอร์เข้า
มาใช้ การทำางานใด ๆ ของ
114. 115. 116. 116
จะใช้ระบบดัชนีโดยผ่าน
เครื่องหมาย [ ] เช่น
อ้างถึงสมาชิกตัวที่ 3 ของอาร์เรย์
ด้วย table[2] เป็นต้น การใช้งาน
สมาชิกของอาร์เรย์สามารถใช้งาน
ได้เหมือนตัวแปรพื้นฐานทั่วไป
การอ้างถึงสมาชิกในการอ้างถึงสมาชิกใน
อาร์เรย์อาร์เรย์
117. 117
sumThird = table[0] +
table[1] + table[2];
table[0] = 5;
if ( a[0] > a[9] )
printf (“First is greater
than lastn” );
ตัวอ
ย่าง
118. 119. 119
สมมติให้ i, j, k เป็นตัวแปรประเภท
int
for (int k = 0; k < 9; k++)
printf (“Value at %d =
%dn”, k+1, table[k]);
table[i + j] = 0;
table[7 – table[j]] = j;
ตัวอ
ย่าง
120. 121. 122. 123. 124. 124
6.6 การใช้ตัวชี้กับอาร์เรย์
การทำางานใด ๆ ของอาร์เรย์สามารถ
ใช้พอยน์เตอร์เข้ามาช่วย ซึ่งจะ
ทำาให้มีความเร็วในการทำางานสูงขึ้น
สมมติว่ามีอาร์เรย์ a และพอยน์เตอร์
pa ดังนี้
int a[10];
int *pa;
กำาหนดให้พอยน์เตอร์ pa ชี้ไปยัง
อาร์เรย์ a ด้วยคำาสั่ง
pa = &a[0]; /* หรือใช้คำา
125. 126. 127. 127
กรณีที่ pa ชี้อยู่ที่ a[0] คำา
สั่ง
pa+1;
จะเป็นการอ้างถึงแอดเดรส
ของ a[1] หากเป็น pa+i
เป็นการอ้างถึงแอดเดรส a[i]
หากต้องการอ้างถึงข้อมูล
ภายในของสมาชิกของ
128. 129. 129
การสั่งให้บวก 1 หรือบวก i หรือ
ลบ i เป็นเหมือนการเลื่อนไปยังสมาชิก
ของอาร์เรย์ตำาแหน่งที่ต้องการ
เนื่องจากประเภทของข้อมูลแต่ละ
ประเภทของอาร์เรย์ เช่น int, float,
double และอื่น ๆ มีขนาดของข้อมูลที่
ต่างกัน ทำาให้ขนาดของสมาชิก
ภายในอาร์เรย์แต่ละประเภทมีขนาด
แตกต่างกันด้วย การสั่งให้บวกหรือลบ
ด้วยจำานวนที่ต้องการนั้นจะมีกลไกที่ทำา
130. 131. 132. 133. 134. 134
จะเห็นว่า s เป็นพอยน์เตอร์ ใน
ฟังก์ชันจะมีการตรวจสอบข้อมูลว่ามี
‘ค่าเท่ากับ 0’ หรือไม่ และมีการเลื่อน
ตำาแหน่งทีละ 1 ค่า (นับว่าข้อมูลมี
ความยาวเพิ่มขึ้นทีละ1) โดยใช้ s++
การเรียกใช้ฟังก์ชัน strlen สามารถ
ทำาได้หลายลักษณะ
strlen (“hello world”); /*
string constant */
strlen (array); /*
135. 136. 136
f (&a[2])
หรือ f (a+2)
เป็นการส่งแอดเดรสของ
สมาชิก a[2] ให้กับฟังก์ชัน f
การประกาศฟังก์ชัน f สามารถ
ทำาได้โดยการประกาศ
f (int arr[ ])
{ ......... }
ตัวอ
ย่าง
137. 137
6.7 การคำานวณกับแอดเดรส
ให้ p เป็นพอยน์เตอร์ชี้ไปยัง
อาร์เรย์ใด ๆ คำาสั่ง p++ เป็นการ
เลื่อน p ไปยังสมาชิกถัดไป และคำา
สั่ง p += i เป็นการเลื่อนพอยน์
เตอร์ไป i ตำาแหน่งจากตำาแหน่ง
ปัจจุบัน นอกจากนี้ยังสามารถใช้
เครื่องหมายความสัมพันธ์
(Relational Operator) เช่น ==, !
138. 138
p < q
จะเป็นจริงเมื่อ p ชี้ไปที่สมาชิกที่
อยู่ก่อนหน้าสมาชิกที่ q ชี้อยู่ การ
เปรียบเทียบในลักษณะจะใช้ได้
ต่อเมื่อ p และ q ชี้ไปที่อาร์เรย์
เดียวกันเท่านั้น
นอกจากนี้ยังสามารถใช้การ
ลบหรือการบวกกับพอยน์เตอร์ได้
เช่นเดียวกัน แต่สิ่งที่ควรระวังคือ
139. 140. 140
เนื่องจาก s ชี้อยู่ที่
ตำาแหน่งเริ่มต้น โดยมี p ชี้ไปที่
s เช่นเดียวกัน แต่จะมีการ
เลื่อน p ไปทีละหนึ่งตำาแหน่ง
จนกว่าค่าที่ตำาแหน่งที่ p ชี้อยู่
‘จะเท่ากับ 0’ เมื่อนำา p ค่า
สุดท้ายมาลบกับ s ที่ตำาแหน่ง
เริ่มต้นก็จะได้ความยาวของ
141. 142. 142
“I am a string”
เมื่อมีการใช้ค่าคงที่สตริงจะมีการ
พื้นที่ในหน่วยความจำาเท่ากับความ
ยาวของค่าคงที่สตริงบวกด้วย 1
เนื่องจากลักษณะการเก็บข้อมูล
ประเภทข้อความในหน่วยความจำา
จะมีการปะตัวอักษร null ‘หรือ 0’
ต่อท้ายเสมอเพื่อให้รู้ว่าเป็นจุดสิ้น
สุดของข้อมูล การจองพื้นที่ดังกล่าว
ตัวอย่
าง
143. 144. 145. 146. 147. 148. 148
void strcpy ( char *s,
char *t )
{
int i=0;
while ( ( s[i] = t[i] ) !=
‘0’ )
i++;
ตัวอย่า
ง 6.5
ฟังก์ชัน strcpy ( ) ทำา
หน้าที่สำาเนาข้อความ
จากตัวแปรหนึ่งไปยังอีก
ตัวแปรหนึ่งเขียนใน
ลักษณะอาร์เรย์
149. 149
void strcpy ( char *s,
char *t )
{
while ( ( *s = *t ) !=
‘0’ ) {
s++;
t++;
ตัวอย่า
ง 6.6
ฟังก์ชัน strcpy ( )
เขียนในลักษณะ
พอยน์เตอร์
150. 150
void strcpy ( char *s,
char *t )
{
while ( ( *s++ = *t++
) != ‘0’ ) ;
}
ตัวอย่า
ง 6.7
ฟังก์ชัน strcpy ( )
เขียนในลักษณะ
พอยน์เตอร์แบบสั้น
151. 151
การประกาศตัวแปรชี้ (pointer)
ชี้ไปยัง structกรณีการส่งอากิวเมนท์เป็นตัวแปร struct จะ
ไม่เหมาะกับ struct
ที่มีขนาดใหญ่ เนื่องจากทุกครั้งที่ส่งตัวแปร
struct จะเป็นการสำาเนา
ตัวแปรตัวใหม่ขึ้นมาในฟังก์ชัน ซึ่งจะทำาให้
ช้าและเปลืองพื้นที่หน่วย
ความจำา เราจะใช้พอยน์เตอร์เข้ามาช่วยแก้
ปัญหานี้
โดยส่งแอดเดรสของตัวแปร struct มายัง
ฟังก์ชันซึ่งรับอากิวเมนท์ เป็นพอยน์เตอร์
อากิวเมนท์จะชี้ไปยังแอดเดรสเริ่มต้นของ
152. 152
ตัวอย่
าง struct point origin, *pp;
pp = &original;
printf ( “origin is (%d, %d)n”,
(*pp).x, (*pp).y );
จะได้ตัวแปร pp ชี้ไปยังข้อมูลแบบ
โครงสร้างชื่อ struct point การ
เขียน *pp จะเป็นการอ้างถึง
โครงสร้าง
การอ้างถึงสมาชิกสามารถการอ้างถึงสมาชิกสามารถ
153. 154. 155. 156. 156
6.9 ตัวชี้ (pointer) ชี้ไปยัง
โครงสร้าง
(pointer to structures)
พอยน์เตอร์เป็นตัวแปรที่เก็บ
แอดเดรสของตัวแปรอื่น
สามารถใช้ชี้ไปยังข้อมูล
ประเภทใด ๆ การใช้พอยน์
เตอร์ชี้ไปยังโครงสร้างสามารถ
ทำาได้ดังนี้
157. 158. 159. 160. 161. 162. 162
#include <stdio.h>
struct date { /*date template */
int day;
int month;
int year;
};
typedef struct date Date;
typedef Date *PtrDate;
ตัวอย่าง
6.8
โปรแกรมตัวอย่างการใช้ตัว
ชี้ (pointer) ชี้ไปยัง
โครงสร้าง
163. 163
main ( ) {
Date today;
PtrDate ptrdate;
ptrdate = &today;
ptrdate->day = 27;
ptrdate->month = 9;
ptrdate->year = 1985;
printf ( “Today’s date is
%2d/%2d/%4dn”,
ptrdate->day, ptrdate-
ตัวอย่าง 6.8
(ต่อ)
164. 165. 166. 167. 168. 169. 169
การกำาหนดค่าเริ่มต้นให้กับอาร์เรย์ของ
โครงสร้างสามารถทำาได้โดย
Person staff[ ] = { { “Bloggs”,
“Joe”, MALE, 21 },
{ “Smith”, “John”,
MALE, 30 },
{ “Black”, “Mary”,
FEMALE, 25 } };
การกำาหนดค่าเริ่มต้นให้กับ
อาร์เรย์ของโครงสร้าง
170. 171. 172. 173. 174. 174
อ้างอิงถึงข้อมูลในอาร์เรย์ 2 มิติ
ะมองอาร์เรย์ 2 มิติในลักษณะที่ประกอบด
w) และคอลัมน์(column) โดยข้อมูลที่อ้าง
ยถึง แถว และข้อมูลถัดมาคือ คอลัมน์
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]
175. 176. 177.