1. Trang chủ
  2. » Đề thi

Bài giảng Lập trình C: Chương 7 - Ngô Công Thắng

20 18 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 152,7 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

[r]

Trang 1

Ch ươ ng 7 Con tr

I Đ a ch và con tr ị ỉ ỏ

II Con tr , m ng và xâu ký t ỏ ả ự

III Qu n lý b nh v i hàm malloc() và free() ả ộ ớ ớ

IV Bài t p ch ng 7 ậ ươ

Trang 2

I Đ a ch và con tr ị ỉ ỏ

1 Đ a ch (h ng con tr ) ị ỉ ằ ỏ

2 Toán t đ a ch & ử ị ỉ

3 Khai báo bi n con tr ế ỏ

4 Truy nh p bi n qua con tr ậ ế ỏ

5 Con tr ỏ void và con tr NULL

6 Các phép toán trên con trỏ

7 Con tr tr t i con tr ỏ ỏ ớ ỏ

Trang 3

1 Đ a ch (h ng con tr ) ị ỉ ằ ỏ

M i byte trong b nh máy tính có m t đ a ỗ ộ ớ ộ ị

ch Các đ a ch này là các s b t đ u t 0 tr ỉ ị ỉ ố ắ ầ ừ ở

đi Ví d có 1 MB b nh thì đ a ch th p ụ ộ ớ ị ỉ ấ

nh t là 0 và đ a ch cao nh t là 1.048.575 ấ ị ỉ ấ

B t kỳ ch ng trình nào khi đ c n p vào b ấ ươ ượ ạ ộ

nh đ u chi m m t kho ng đ a ch Đi u đó ớ ề ế ộ ả ị ỉ ề

có nghĩa là m i bi n và m i hàm trong ọ ế ọ

ch ng trình đ u b t đ u t i m t đ a ch c ươ ề ắ ầ ạ ộ ị ỉ ụ

th Hình 7.1 cho th y các đ a ch b nh ể ấ ị ỉ ộ ớ

Trang 4

1 Đ a ch (h ng con tr ) ị ỉ ằ ỏ ti p ế

Hình 7.1 Đ a ch b nhị ỉ ộ ớ

ch ươ ng trình

655.359

var1 var2

var3

var4

int char float

int

314.810 314.809 314.808 314.807 314.806 314.805 314.804 314.803 314.802 314.801 314.800 314.799 var1 có đ a ch 314.809 ị ỉ

var2 có đ a ch 314.808 ị ỉ var3 có đ a ch 314.804 ị ỉ var4 có đ a ch 314.802 ị ỉ

Trang 5

2 Toán t đ a ch & ử ị ỉ

 Toán t đ a ch ký hi u là &, đ c dùng ử ị ỉ ệ ượ

đ l y đ a ch c a m t bi n Toán t & ể ấ ị ỉ ủ ộ ế ử

ph i đ t tr c tên bi n mu n l y đ a ch ả ặ ướ ế ố ấ ị ỉ

Ví d : Ch ng trình sau s đ a ra đ a ụ ươ ẽ ư ị

ch c a 3 bi n nguyên a, b, c ỉ ủ ế

Trang 6

3 Khai báo bi n con tr ế ỏ

 Vì đ a ch b nh là s nên nó cũng có th l u tr ị ỉ ộ ớ ố ể ư ữ trong m t bi n gi ng nh giá tr c a các ki u int, ộ ế ố ư ị ủ ể char và float M t bi n mà ch a giá tr đ a ch g i là ộ ế ứ ị ị ỉ ọ

bi n con tr hay g i t t là con tr N u m t con tr ế ỏ ọ ắ ỏ ế ộ ỏ

ch a đ a ch c a m t bi n thì ta nói r ng con tr tr ứ ị ỉ ủ ộ ế ằ ỏ ỏ

t i bi n đó.ớ ế

 Đ khai báo các bi n con tr ta dùng cú pháp sau:ể ế ỏ

Ki u* Tên_bi n_con_tr ;ể ế ỏ

trong đó Ki uể là ki u d li u c a đ i t ng mà bi n ể ữ ệ ủ ố ượ ế con tr s tr t i D u * có nghĩa là tr t i Nên đ ỏ ẽ ỏ ớ ấ ỏ ớ ể

d u * bên c nh tên ki u đ nh n m nh r ng nó là ấ ạ ể ể ấ ạ ằ

m t ph n c a ki u ch không ph i c a tên bi n con ộ ầ ủ ể ứ ả ủ ế

tr ỏ

Trang 7

3 Khai báo bi n con tr (ti p) ế ỏ ế

 Ví d : ụ

int a;

int* ptr;

ptr = &a;

L nh này khai báo m t bi n con tr có tên là ptr tr t i các ệ ộ ế ỏ ỏ ớ

s nguyên int Nói cách khác con tr ptr có th ch a đ a ch ố ỏ ể ứ ị ỉ

c a các bi n nguyên ủ ế

 Đ khai báo nhi u bi n con tr cùng tr t i m t ki u d li u ể ề ế ỏ ỏ ớ ộ ể ữ ệ

ta vi t: ế

Ki u *Bi n1, *Bi n2, *Bi n3,…; ể ế ế ế

M c dù d u * đ c nh tên bi n con tr nh ng v n nên hi u ặ ấ ể ạ ế ỏ ư ẫ ể

nó là m t ph n c a ki u ộ ầ ủ ể

Ví d : int *p, *q; ụ

Trang 8

3 Khai báo bi n con tr (ti p) ế ỏ ế

 Khi khai báo m t bi n con tr thì bi n con tr này ộ ế ỏ ế ỏ

s ch a m t giá tr vô nghĩa (tr khi đ c kh i t o) ẽ ứ ộ ị ừ ượ ở ạ Giá tr vô nghĩa này có th là đ a ch c a m t ô nh ị ể ị ỉ ủ ộ ớ nào đó n m trong ph n ch ng trình c a ta ho c h ằ ầ ươ ủ ặ ệ

đi u hành Đi u này s r t nguy hi m n u ta đ a giá ề ề ẽ ấ ể ế ư

tr vào ô nh do con tr này tr t i B i v y, tr c ị ớ ỏ ỏ ớ ở ậ ướ khi s d ng m t con tr ta ph i đ a đ a ch vào nó.ử ụ ộ ỏ ả ư ị ỉ

 Con tr tr t i ki u nào thì ch ch a đ c đ a ch ỏ ỏ ớ ể ỉ ứ ượ ị ỉ

c a các bi n ki u đó Không th gán đ a ch c a ủ ế ể ể ị ỉ ủ

bi n float t i m t con tr tr t i int.ế ớ ộ ỏ ỏ ớ

Trang 9

4 Truy nh p bi n qua con tr ậ ế ỏ

M t câu h i đ t ra là n u không bi t tên m t ộ ỏ ặ ế ế ộ

bi n mà ch bi t đ a ch c a nó thì có truy ế ỉ ế ị ỉ ủ

nh p đ c vào bi n đó không? Câu tr l i là ậ ượ ế ả ờ

có Con tr ch a đ a ch c a m t bi n nên ta ỏ ứ ị ỉ ủ ộ ế

có th truy nh p bi n qua con tr ể ậ ế ỏ

Đ truy nh p t i bi n do con tr ptr tr t i ta ể ậ ớ ế ỏ ỏ ớ dùng toán t truy nh p gián ti p * đ t tr c ử ậ ế ặ ướ tên bi n con tr : *ptr *ptr t ng đ ng v i ế ỏ ươ ươ ớ tên c a bi n, ch nào dùng đ c tên bi n thì ủ ế ỗ ượ ế

ch đó dùng đ c *ptr ỗ ượ

Trang 10

4 Truy nh p bi n qua con tr ậ ế ỏ

 Toán t truy nh p gián ti p cũng ký hi u là * nh ng ử ậ ế ệ ư

có nghĩa là giá tr c a bi n đ c tr t i b i bi n con ị ủ ế ượ ỏ ớ ở ế

tr n m bên ph i nóỏ ằ ả , khác v i d u * khi khai báo ớ ấ

bi n con tr có nghĩa là ế ỏ tr t iỏ ớ

 Ví d :ụ

int v; //Khai báo bi n có ki u intế ể

int* p; //Khai báo bi n con tr p tr t i intế ỏ ỏ ớ

p = &v; //Gán đ a ch c a bi n v cho con tr pị ỉ ủ ế ỏ

v = 3; //Gán 3 vào v

*p = 3; //Gán 3 vào v gián ti p qua con tr pế ỏ

v p

Trang 11

5 Con tr tr t i ỏ ỏ ớ void và con tr NULL

 Ta bi t r ng con tr tr t i ki u nào thì ch ch a ế ằ ỏ ỏ ớ ể ỉ ứ

đ c đ a ch c a các bi n ki u đó Tuy nhiên trong ượ ị ỉ ủ ế ể C++ còn có m t lo i con tr đa năng có th tr t i ộ ạ ỏ ể ỏ ớ

b t kỳ ki u d li u nào Con tr đó g i là con tr tr ấ ể ữ ệ ỏ ọ ỏ ỏ

t i void Khai báo con tr tr t i void nh sau:ớ ỏ ỏ ớ ư

void* ptr;

 Con tr NULL là con tr không tr t i b t c cái gì, ỏ ỏ ỏ ớ ấ ứ

nó ch a giá tr r ng (b ng 0) Đ có con tr r ng ta ứ ị ỗ ằ ể ỏ ỗ gán giá tr 0 vào bi n con tr Ta có th s d ng tên ị ế ỏ ể ử ụ

h ng này đ t o con tr r ng.ằ ể ạ ỏ ỗ

int* ptr=NULL;

Trang 12

5 Con tr tr t i ỏ ỏ ớ void và con tr NULL (ti p) ỏ ế

Ví d :

int ivar;

float fvar;

int* iptr;

float* fptr;

void* vptr;

iptr = &ivar;

//iptr = &fvar; //l i vì gán float* t i int*ỗ ớ

fptr = &fvar;

//fptr = &ivar; //l i vì gán int* t i float*ỗ ớ

vptr = &ivar; //đ c vì gán int* t i void*ượ ớ

vptr = &fvar; //đ c vì gán float* t i void*ượ ớ

Trang 13

6 Các phép toán trên con trỏ

Các phép toán s h c: ố ọ

 Ch có 4 phép toán dùng đ c v i con tr là +, -, ỉ ượ ớ ỏ ++,

 Khi c ng ho c tr bi n con tr v i m t s thì s ộ ặ ừ ế ỏ ớ ộ ố ố

đó ph i nguyên.ả

 Các phép toán s h c tác đ ng trên con tr khác ố ọ ộ ỏ

v i bình th ng C th là khi tăng bi n con tr ớ ườ ụ ể ế ỏ lên 1 đ n v thì đ a ch ch a trong bi n con tr ơ ị ị ỉ ứ ế ỏ không tăng lên m t mà tăng lên m t l ng b ng ộ ộ ượ ằ kích th c ki u d li u con tr tr t i (th ng là ướ ể ữ ệ ỏ ỏ ớ ườ

2 v i ki u int, 4 v i ki u float và 8 v i ki u ớ ể ớ ể ớ ể double)

Trang 14

6 Các phép toán trên con tr (ti p) ỏ ế

 Ví d : gi s p là con tr int ch a đ a ch 200, sau khi ụ ả ử ỏ ứ ị ỉ

l nh ệ ++p;

đ c th c hi n thì p s có giá tr là 202 N u p là con tr ượ ự ệ ẽ ị ế ỏ float thì sau l nh trên p s có giá tr là 204 ệ ẽ ị

Các phép toán so sánh: có th so sánh hai

bi n con tr b ng các phép toán so sánh Tuy ế ỏ ằ nhiên vi c so sánh này ch có ý nghĩa trong ệ ỉ hai tr ng h p sau: ườ ợ

 So sánh hai con tr đ xem chúng có b ng con tr NULL ỏ ể ằ ỏ không.

Trang 15

6 Các phép toán trên con tr (ti p) ỏ ế

 So sánh hai con tr khi chúng cùng liên quan t i m t đ i ỏ ớ ộ ố

t ng, ch ng h n là cùng tr t i m t bi n ượ ẳ ạ ỏ ớ ộ ế

Phép gán: Có th gán m t bi n con tr cho m t ể ộ ế ỏ ộ

bi n con tr có cùng ki u tr t i.ế ỏ ể ỏ ớ

L u ýư : Khi dùng toán t tăng ho c gi m v i bi n do ử ặ ả ớ ế con tr tr t i thì ph i chú ý v th t th c hi n các ỏ ỏ ớ ả ề ứ ự ự ệ phép toán Ví d : n u ta vi tụ ế ế

*p++;

thì con tr s tăng lên 1 ch không ph i bi n do con ỏ ẽ ứ ả ế

tr tr t i tăng lên 1, b i vì phép toán * và ++ cùng ỏ ỏ ớ ở

m c u tiên, đ c k t h p t ph i qua trái Mu n ứ ư ượ ế ợ ừ ả ố tăng bi n do con tr tr t i ta ph i vi t:ế ỏ ỏ ớ ả ế

(*p)++;

Trang 16

7 Con tr tr t i con tr ỏ ỏ ớ ỏ

Trong C++, m t con tr có th tr t i m t ộ ỏ ể ỏ ớ ộ con tr khác, t c là m t con tr có th ch a ỏ ứ ộ ỏ ể ứ

đ a ch c a m t bi n con tr khác ị ỉ ủ ộ ế ỏ

Giá trị

Bi nế

Đ a chị ỉ Con trỏ

Giá trị

Bi nế

Đ a chị ỉ

Con trỏ

Đ a chị ỉ Con trỏ

Trang 17

7 Con tr tr t i con tr (ti p) ỏ ỏ ớ ỏ ế

 Đ khai báo m t bi n con tr tr t i m t con tr ta dùng ể ộ ế ỏ ỏ ớ ộ ỏ thêm d u * n a Ví d : ấ ữ ụ

int** p; //p là con tr tr t i m t con tr int ỏ ỏ ớ ộ ỏ

 Đ truy nh p t i bi n qua con tr tr t i con tr ta ph i dùng ể ậ ớ ế ỏ ỏ ớ ỏ ả hai l n toán t truy nh p gián ti p Ki u truy nh p này g i là ầ ử ậ ế ể ậ ọ truy nh p gián ti p b i (Multiple Indirection) Ví d : ậ ế ộ ụ

char ch;

char* p;

char** mp;

ch='A';

p=&ch;

mp=&p;

cout<<"Ky tu nam trong bien ch la: "<<**mp;

Trang 18

II Con tr , m ng và xâu ký t ỏ ả ự

1 Con tr và m ng ỏ ả

2 Con tr và xâu ký t ỏ ự

Trang 19

1 Con tr và m ng ỏ ả

 Con tr đ c s d ng đ truy nh p vào các ph n t c a m ng ỏ ượ ử ụ ể ậ ầ ử ủ ả

và làm đ i s truy n vào hàm Và khi m ng làm đ i s ố ố ề ả ố ố truy n vào hàm thì con tr cũng r t h u ích ề ỏ ấ ữ

 Các ph n t c a m ng có th đ c truy nh p qua ký hi u c a ầ ử ủ ả ể ượ ậ ệ ủ

m ng ([]) ho c ký hi u c a con tr (*) Ví d : ả ặ ệ ủ ỏ ụ

int a[5]={31,54,77,52,93};

int i;

//Dua ra bang ky hieu cua mang

for(i=0;i<5;i++) printf("%i ",a[i]);

//Dua ra bang ky hieu cua con tro

for(i=0;i<5;i++) printf("%i ",*(a+i));

Trang 20

1 Con tr và m ng (ti p) ỏ ả ế

 Bi u th c *(a+i) t ng đ ng v i a[i] Ví d , v i ể ứ ươ ươ ớ ụ ớ i=2 thì *(a+2) là ph n t th 3 (có giá tr là 77) ầ ử ứ ị

 T i sao *(a+2) l i là ph n t th 3? Nh ta đã bi t, ạ ạ ầ ử ứ ư ế tên bi n m ng chính là đ a ch c a ph n t đ u tiên ế ả ị ỉ ủ ầ ử ầ

c a bi n m ng Khi ta vi t (a+2) thì trình biên d ch ủ ế ả ế ị

s th c hi n c ng đ a ch v i 2 Khi c ng đ a ch v i ẽ ự ệ ộ ị ỉ ớ ộ ị ỉ ớ

2 trình biên d ch l y kích th c ki u d li u c a ị ấ ướ ể ữ ệ ủ

m ng nhân v i 2 r i m i c ng vào đ a ch K t qu ả ớ ồ ớ ộ ị ỉ ế ả (a+2) cho ta đ a ch c a ph n t th 3 Đ truy nh p ị ỉ ủ ầ ử ứ ể ậ

t i ph n t th 3 khi bi t đ a ch ph i s d ng toán ớ ầ ử ứ ế ị ỉ ả ử ụ

t truy nh p gián ti p *(a+2).ử ậ ế

Ngày đăng: 09/03/2021, 06:32

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm