Tải bản đầy đủ (.pdf) (23 trang)

S nmc8 contro

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.5 MB, 23 trang )

Chương 8
Con trỏ (Pointer)
Presenter:

Nhập mơn về lập trình (C8)

Slide 1


Learning outcomes
L.O.6.1 – Khai báo được con trỏ.
L.O.6.2 – Truy xuất được dữ liệu qua con trỏ.
L.O.6.3 – Giải thích được cách cấp phát bộ nhớ động.
L.O.6.4 – Sử dụng được các phép toán trên con trỏ.
L.O.6.5 – Sử dụng được con trỏ của con trỏ khác.
L.O.6.6 – Dùng được con trỏ với kiểu cấu trúc.
L.O.6.7 – Hiểu được sự liên quan giữa con trỏ và mảng.

Nhập môn về lập trình (C8)

Slide 2


Kiểu con trỏ (pointer)
Định nghĩa
 Kiểu con trỏ là kiểu biến đặc biệt chỉ dùng để giữ địa chỉ
(tham khảo). Dùng dấu * để định nghĩa.
Ví dụ:
 Tốn tử '&' cho phép gán địa chỉ của một biến vào con trỏ
như sau :
<con trỏ> = &<tên biến>


Ví dụ :
 Con trỏ biến được dùng lưu giữ địa chỉ các biến và cho
phép truy xuất biến một cách gián tiếp.
 Ứng dụng thường dùng con trỏ là tham số hàm.
Nhập môn về lập trình (C8)

Slide 3


Con trỏ biến số (pointer)
Ví dụ 1

Nhập mơn về lập trình (C8)

Slide 4


Con trỏ biến cấu trúc
Ví dụ con trỏ là tham số hàm
Định
Định nghĩa
nghĩa kiểu
kiểu

KieuHoso.h

Định
Định nghĩa
nghĩa biến
biến

main.c
Khai
Khai báo
báo biến
biến

Ham.h
Nhập môn về lập trình (C8)

Slide 5


Con trỏ biến cấu trúc
Ví dụ con trỏ là tham số hàm

main.c

Nhập mơn về lập trình (C8)

Slide 6


Con trỏ biến cấu trúc
Ví dụ con trỏ là tham số hàm
Ham.c

Nhập mơn về lập trình (C8)

Slide 7



Con trỏ biến cấu trúc
Chạy thử

Nhập mơn về lập trình (C8)

Slide 8


Pointer và cấp phát động
Ý tưởng
 Kiểu pointer rất thích hợp để quản lý dữ liệu có độ lớn chưa
biết trước tại thời điểm lập trình.
 Ví dụ :
double param[100][100]; // cấp phát 10.000 phần tử kiểu double
hay

double** param;

// chỉ cấp phát 1 pointer

(double)

(double**)
(double*)

Nhập mơn về lập trình (C8)

A
M


N

TR

Slide 9


Pointer và cấp phát động
Hiện thực
 Sau khi có con trỏ đến ma trận, để có ma trận thực sự, ta dùng
hàm malloc()(memory allocation) trong thư viện malloc.lib
(#include malloc.h) để sinh ra các vector và phần tử.
 Ví dụ :
• Sinh ra m vector (m chưa biết trước)
printf("Nhap M: ");scanf("%d",&m);
param=(double**)malloc(m*sizeof(double*));
• Sinh ra n phần tử trong mỗi vector (n chưa biết trước)
printf("Nhap N: ");scanf("%d",&n);
for(i=0;iparam[i]=(double*)malloc(n*sizeof(double));

 Chú ý toán tử sizeof(kiểu) trả về kích thước kiểu cần cấp
phát trong bộ nhớ.

Nhập mơn về lập trình (C8)

Slide 10



Pointer và cấp phát động
Ví dụ thư viện Malloc.lib

Nhập mơn về lập trình (C8)

Slide 11


Ví dụ thêm về con trỏ
 int* pi;

// pointer to int

 char** ppc ;

// pointer to pointer to char

 int* ap[15];

// array of 15 pointers to ints

 int (*fp)(char*);

// pointer to function taking a char*
// argument; returns an int

 int* f(char*);

// function taking a char* argument;
// returns a pointer to int


Nhập mơn về lập trình (C8)

Slide 12


Pointers to strings
Đúng hay sai ?
 char *psz;
psz = “File not ready”;
 char *psz = “File not ready”;
char pszarray[ ] = “Drive not ready”;
 char pszarray[16];
pszarray = “Drive not ready”;
 char *psz;
scanf(“%s”,psz);
Nhập mơn về lập trình (C8)

Slide 13


Pointer arithmetic and arrays
Ví dụ nhập/xuất dãy ký tự theo phần tử

Nhập mơn về lập trình (C8)

Slide 14


Pointer arithmetic and arrays

Ví dụ 2 xử lý chuỗi theo con trỏ

Nhập mơn về lập trình (C8)

Slide 15


Con trỏ và hằng
void f1 (char *p)
{ char s[] = "Gorm";
const char* pc=s ;
pc[3]=´g´;
pc=p;

// con trỏ đến một hằng
// sai: khơng thể thay đổi nội dung
// ok: có thể thay đổi địa chỉ

char *const cp=s;
cp[3]=´a´;
cp=p;

// hằng con trỏ
// ok: có thể thay đổi nội dung
// sai: không thể thay đổi địa chỉ

const char *const cpc=s;
cpc[3]=´a´;
cpc=p ;


// hằng con trỏ đến một hằng
// sai: không thể thay đổi nội dung
// sai: lẫn địa chỉ

}
*const là toán tử khai báo hằng con trỏ (khơng có tốn tử const*).
Nhập mơn về lập trình (C8)

Slide 16


Phép tốn trên pointer
Kết quả nhận được là gì ?

 Thường dùng

(pointer + integer)

 Có thể trừ số nguyên vào con trỏ

(pointer - integer)

 Có thể trừ hai con trỏ

(pointer - pointer)

 Có thể so sánh hai con trỏ với nhau

Nhập mơn về lập trình (C8)


(<=, =, >=)

Slide 17


Con trỏ đến hàm
Ví dụ nhập/xuất hồ sơ điểm

main.c

Nhập mơn về lập trình (C8)

Slide 18


Con trỏ đến hàm
Module Ham.c

Nhập mơn về lập trình (C8)

Slide 19


Con trỏ đến hàm
Module Ham.h và KieuHoso.h
Ham.h

KieuHoso.h

Nhập môn về lập trình (C8)


Slide 20


Con trỏ đến hàm
Sử dụng con trỏ hàm

main1.c
Nhập môn về lập trình (C8)

Slide 21


Dãy con trỏ hàm
Khái niệm
 Dãy con trỏ hàm thích hợp với các bài toán xử lý theo sơ
đồ chuyển trạng thái (trạng thái là chỉ số của dãy).

Nhập
số N

Tính
tốn

01

Gọi hàm xuly[1] ()
Nhập mơn về lập trình (C8)

00


Gọi hàm xuly[0] ()

In kết
quả

02
Gọi hàm xuly[2] ()
Slide 22


Con trỏ đến hàm
Sử dụng dãy con trỏ hàm

main2.c

Nhập môn về lập trình (C8)

Slide 23



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×