1. Trang chủ
  2. » Giáo án - Bài giảng

giáo trình C chương 6

40 295 1
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Con trỏ
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành C Programming
Thể loại Bài học
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 40
Dung lượng 3,67 MB

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

Nội dung

Chương 6 Con trỏ Mục tiêu bài học Tìm hiểu về con trỏ và khi nào thì sử dụng con trỏ. Cách sử dụng biến con trỏ và các toán tử con trỏ. Gán giá trị cho con trỏ. Phép toán trên con trỏ. So sánh con trỏ. Con trỏ và mảng một chiều. Con trỏ và mảng nhiều chiều. Con trỏ và chuỗi ký tự. Con trỏ hàm.

Trang 1

Chương 6

Con trỏ

Trang 2

Mục tiêu bài học

 Tìm hiểu về con trỏ và khi nào thì sử dụng con trỏ

 Cách sử dụng biến con trỏ và các toán tử con trỏ

 Gán giá trị cho con trỏ

 Phép toán trên con trỏ

Trang 3

Con trỏ là gì?

 Con trỏ là một biến, nó chứa địa chỉ ô nhớ của một biến khác

 Nếu một biến chứa địa chỉ của một biến khác, thì

biến này được gọi là con trỏ trỏ đến biến thứ hai

 Con trỏ cung cấp phương thức truy xuất gián tiếp đến giá trị của một phần tử dữ liệu

 Các con trỏ có thể trỏ đến các biến có kiểu dữ liệu cơ bản như int, char, double, hay dữ liệu tập hợp như mảng hoặc cấu trúc

Trang 4

Con trỏ được sử dụng để làm gì?

Các tình huống con trỏ có thể được sử dụng:

 Để trả về nhiều hơn một giá trị từ một hàm

 Để truyền mảng và chuỗi từ một hàm đến một

hàm khác thuận tiện hơn

 Để làm việc với các phần tử của mảng thay vì

truy xuất trực tiếp vào các phần tử này

 Để cấp phát bộ nhớ và truy xuất bộ nhớ (Cấp

phát bộ nhớ trực tiếp)

Trang 5

Biến con trỏ

 Khai báo con trỏ: chỉ ra một kiểu cơ sở và

một tên biến được đặt trước bởi dấu *

Cú pháp khai báo biến con trỏ:

Ví dụ:

<Kiểu dữ liệu> *<Biến trỏ>;

int * p ; p là một con trỏ trỏ đến 1 biến kiểu nguyên

Trang 6

Các toán tử con trỏ

 Hai toán tử đặc biệt được sử dụng: & *

 & là toán tử một ngôi và nó trả về địa chỉ ô nhớ của toán hạng:

Toán tử * là phần bổ xung của toán tử &

Trang 7

Gán trị đối với con trỏ

 Các giá trị có thể được gán cho con trỏ thông

qua toán tử &:

p1 = &a;

Ở đây địa chỉ của a được lưu vào biến p

 Cũng có thể gán giá trị cho con trỏ thông qua một biến con trỏ khác trỏ có cùng kiểu:

p2 = p1;

Trang 8

 Có thể gán giá trị cho các biến thông qua con trỏ:

Trang 9

Bài tập 1: Viết chương trình:

Khai báo biến a, con trỏ p

Cho p là con trỏ trỏ đến biến a

 Hiển thị ra màn hình địa chỉ của biến a, giá trị

của con trỏ p

 Nhập giá trị cho biến a

 Kiểm tra giá tri *p

 Nhập giá trị gián tiếp cho biến a thông qua con

trỏ p

Bài tập áp dụng

Trang 10

 Sau biểu thức “p++; ” p sẽ có giá trị là 1004 do số

nguyên có kích thước là 4 bytes

Trang 11

Phép toán con trỏ (tt)

Phép toán Ý nghĩa

++p hoặc p++ Trỏ đến số nguyên được lưu trữ kế tiếp sau a p hoặc p Trỏ đến số nguyên được lưu trữ liền trước a

p + i Trỏ đến số nguyên được lưu trữ i vị trí trước a

p – i Trỏ đến số nguyên được lưu trữ i vị trí sau a ++*p hoặc (*p)++ Tăng giá trị của a lên 1

*p++ Tác động đến giá trị của số nguyên được lưu

trữ kế tiếp sau a

Trang 12

 Mỗi lần con trỏ được tăng trị, nó trỏ đến ô nhớ của phần tử kế tiếp

 Mỗi lần con trỏ được giảm trị, nó trỏ đến ô nhớ của phần tử đứng trước nó

 Tất cả con trỏ sẽ tăng hoặc giảm trị theo kích thước của kiểu dữ liệu mà chúng đang trỏ đến

Phép toán con trỏ (tt)

Trang 13

So sánh con trỏ

 Hai con trỏ có thể được so sánh trong một biểu thức quan hệ nếu chúng trỏ đến các biến có cùng kiểu dữ liệu

 Giả sử ptr_a và ptr_b là hai biến con trỏ trỏ đến các phần tử dữ liệu a và b Trong trường hợp này, các phép so sánh sau là có thể:

Trang 14

So sánh con trỏ (tt)

ptr_a < ptr_b Trả về giá trị true nếu a được lưu trữ ở vị trí trước b

ptr_a > ptr_b Trả về giá trị true nếu a được lưu trữ ở vị trí sau b

ptr_a <= ptr_b Trả về giá trị true nếu a được lưu trữ ở vị trí trước b hoặc

ptr_a và ptr_b trỏ đến cùng một vị trí ptr_a >= ptr_b Trả về giá trị true nếu a được lưu trữ ở vị trí sau b hoặc

ptr_a và ptr_b trỏ đến cùng một vị trí

ptr_a == ptr_b Trả về giá trị true nếu cả hai con trỏ ptr_a và ptr_b trỏ

đến cùng một phần tử dữ liệu

ptr_a != ptr_b Trả về giá trị true nếu cả hai con trỏ ptr_a và ptr_b trỏ

đến các phần tử dữ liệu khác nhau nhưng có cùng kiểu

dữ liệu

ptr_a == NULL Trả về giá trị true nếu ptr_a được gán giá trị NULL (0)

Trang 15

Con trỏ và mảng một chiều

 Tên mảng chính là địa chỉ của mảng  con trỏ đến phần tử đầu tiên của mảng

 Địa chỉ của một phần tử mảng có thể được biểu

diễn theo hai cách:

 Sử dụng ký hiệu & trước một phần tử mảng

Ví dụ: &A[i]

 Sử dụng một biểu thức trong đó chỉ số của phần tử được cộng vào tên của mảng

Ví dụ: (A+i)

Trang 16

ary+i);

/*%X gives unsigned hexadecimal*/

} }

Con trỏ và mảng một chiều-Ví dụ

Trang 17

Con trỏ và chuỗi

Ví dụ: Sử dụng con trỏ để truy xuất gián tiếp tới các phần tử của mảng 1 chiều

Trang 18

 Mảng hai chiều có thể được định nghĩa như là một con trỏ trỏ tới một nhóm các mảng một

chiều liên tiếp nhau

 Khai báo một mảng hai chiều có thể như sau:

thay vì

data_type (*ptr_var) [expr 2];

data_type (*ptr_var) [expr1] [expr 2];

Con trỏ và mảng đa chiều

Trang 19

Con trỏ và chuỗi

Ví dụ: Sử dụng con trỏ trong các hàm strstr, và strchr()

Trang 20

Truyền con trỏ vào hàm

 Truyền con trỏ vào hàm thường được sử dụng trong những trường hợp sau đây:

 Để truyền đối số vào hàm dưới hình thức tham

chiếu

 Để truyền các mảng và chuỗi từ một hàm đến một

hàm khác một cách thuận tiện hơn

Trang 21

Truyền con trỏ vào hàm

 Ví dụ: Hàm func() nhận đối số đầu vào là một con trỏ kiểu nguyên,

Trang 22

Truyền con trỏ vào hàm

 Ví dụ: Sử dụng con trỏ để truyền đối số vào hàm

dưới hình thức tham chiếu

Trang 23

Truyền con trỏ vào hàm

 Truyền mảng, chuỗi vào hàm thông qua con trỏ

Trang 24

Truyền con trỏ vào hàm

 Truyền mảng, chuỗi vào hàm thông qua con trỏ

Trang 25

Con trỏ void, ép kiểu con trỏ

 C cho phép khai báo con trỏ void (con trỏ không kiểu)

Vi dụ:

Trang 26

Con trỏ void, ép kiểu con trỏ

 C cho phép ép một con trỏ không kiểu thành một con trỏ có kiểu dữ liệu bất kỳ

P được ép thành con trỏ kiểu float

Trang 27

Con trỏ đa cấp

 Con trỏ đa cấp (con trỏ tới con trỏ) là con trỏ trỏ tới địa chỉ của một con trỏ khác

 Dùng để lấy địa chỉ của con trỏ ở cấp thấp hơn

Cú pháp khai báo:

<Kiểu dữ liệu> (Số lượng dấu * ) Tên biến trỏ ;

Ví dụ: int ** q q là một con trỏ cấp 2

int * p

q chứa địa chỉ của p

q = &p

Trang 28

Bài tập áp dụng

 Khai báo một con trỏ kiểu int

 Sử dụng con trỏ đa cấp để lưu địa chỉ của con trỏ trên

Trang 29

Cấp phát bộ nhớ

Hàm malloc() là một trong các hàm được sử

dụng thường xuyên nhất để thực hiện việc cấp phát bộ nhớ từ vùng nhớ còn tự do

Tham số của hàm malloc() là một số nguyên xác

định số bytes cần cấp phát

Trang 30

Cấp phát bộ nhớ (tt)

Trang 31

Hàm free()

Hàm free() được sử dụng để giải phóng bộ

nhớ khi nó không cần dùng nữa

Cú pháp:

void free(void*ptr);

Hàm này giải phóng không gian được trỏ bởi

ptr, để dùng cho tương lai

ptr phải được dùng trước đó với lời gọi hàm

malloc(), calloc(), hoặc realloc()

Trang 33

for(i=number ; i>0 ; i ) { printf("%d\n",*(ptr+(i-1)));

/* print out in reverse order */

printf("\nMemory allocation failed -

not enough memory.\n");

return 1;

}

}

Hàm free() - tt

Trang 34

Hàm calloc()

calloc tương tự như malloc, nhưng điểm khác biệt

chính là mặc nhiên giá trị 0 được lưu vào không gian

bộ nhớ vừa cấp phát

calloc yêu cầu hai tham số

 Tham số thứ nhất là số lượng các biến cần cấp phát

Trang 35

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

printf("calloc1[%d] holds %05.5f ",i,

Trang 37

Hàm realloc()

Có thể cấp phát lại cho một vùng đã được cấp (thêm/bớt

số bytes) bằng cách sử dụng hàm realloc, mà không làm

mất dữ liệu

realloc nhận hai tham số

 Tham số thứ nhất là con trỏ tham chiếu đến bộ nhớ

 Tham số thứ hai là tổng số byte muốn cấp phát

 Cú pháp:

void *realloc( void *ptr, size_t size );

Trang 38

printf("Now allocating more memory \n");

ptr[5] = 32; /* now it's legal! */

ptr[6] = 64;

Hàm realloc() - tt

Trang 39

for(i=0;i<7;i++) { printf("ptr[%d] holds %d\n", i, ptr[i]);

} realloc(ptr,0);

/* same as free(ptr); - just fancier! */

Trang 40

 Mảng hai chiều có thể được định nghĩa như là một con trỏ trỏ tới một nhóm các mảng một

chiều liên tiếp nhau

 Khai báo một mảng hai chiều có thể như sau:

thay vì

data_type (*ptr_var) [expr 2];

data_type (*ptr_var) [expr1] [expr 2];

Con trỏ hàm

Ngày đăng: 12/05/2014, 13:19

TỪ KHÓA LIÊN QUAN

w