1. Trang chủ
  2. » Giáo Dục - Đào Tạo

cơ sở lập trình con trỏ

40 114 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 40
Dung lượng 5,78 MB

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

Nội dung

Khái niệm Con trỏ Pointer:  Là biến lưu trữ địa chỉ vùng nhớ của một đối tượng biến, hàm..  Biến con trỏ Pointer variable  Chứa địa chỉ vùng nhớ thay vì chứa giá trị.. • Biến x có mộ

Trang 1

CƠ SỞ LẬP TRÌNH

CON TRỎ

Trang 2

Nội dung

1 Khái niệm

2 Khai báo

3 Thao tác với con trỏ

4 Các phép toán với con trỏ

5 Con trỏ và mảng

6 Mảng con trỏ

7 Con trỏ hàm

Trang 3

Khái niệm

 Con trỏ (Pointer):

 Là biến lưu trữ địa chỉ vùng nhớ của một đối tượng (biến, hàm).

 Có tác dụng như truyền tham chiếu.

 Có liên quan chặt chẽ đến mảng và chuỗi.

 Biến con trỏ (Pointer variable)

 Chứa địa chỉ vùng nhớ thay vì chứa giá trị.

 Thông thường, biến chứa giá trị (tham chiếu trực tiếp).

 Con trỏ chứa địa chỉ của biến mang giá trị cụ thể (tham

Trang 4

Khai báo

<type> * <tên biến trỏ>;

Trong đó, <type> là kiểu dữ liệu của biến mà contrỏ đang trỏ đến

Trang 5

Thao tác với con trỏ

Toán tử lấy địa chỉ & : Trả về địa chỉ vùng nhớ của biến.

& x  địa chỉ của biến x

Ví dụ: int x = 10;

• Sử dụng con trỏ để truy xuất địa chỉ của biến x.

• Biến x có một địa chỉ cụ thể trong vùng nhớ.

• Để lấy địa chỉ biến x: sử dụng toán tử & trước x ( & x).

Trang 6

Thao tác với con trỏ

Trang 7

Thao tác với con trỏ

void main()

{

int x = 10, y = 15;

int *px, *py;

px = &x; //px = địa chỉ của x

py = &y; //py = địa chỉ của y

*py = 20; //giá trị trỏ bởi py = 20

*px = *py; //gtrị trỏ bởi px= gtrị trỏ bởi py

px = py; //phép gán con trỏ

*px = 30; //giá trị trỏ bởi px = 30

Trang 8

Thao tác với con trỏ

Trang 9

Thao tác với con trỏ

 Con trỏ NULL:

• Con trỏ không chứa địa chỉ của bất kỳ vùng nhớ nào.

• Nên khởi tạo giá trị NULL hoặc địa chỉ của vùng nhớ nào đó cho biến trỏ lúc khai báo.

Trang 10

Các phép toán với con trỏ

Tăng, giảm con trỏ (++ hoặc )

Cộng, trừ 1 số nguyên với 1 con trỏ

Con trỏ có thể trừ lẫn nhau (cộng, trừ với con trỏ

là vô nghĩa trừ khi dùng cho con trỏ mảng)

Ví dụ: Mảng p có 5 phần tử kiểu int (4 byte)

p trỏ đến phần tử đầu tiên p[0], tại địa chỉ 5000.p+=3; //trỏ đến phần tử thứ 4 p[3], tại địa chỉ5012

p ; //trỏ đến phần tử thứ 3 p[2], tại địa chỉ 5008

Trang 11

Các phép toán với con trỏ

Gán con trỏ (Pointer assignment):

• Một con trỏ có thể được gán cho con trỏ khác nếu cả 2 cùng kiểu.

• Nếu không cùng kiểu thì phải ép kiểu (cast).

So sánh con trỏ (Pointer comparison):

• Sử dụng các toán tử quan hệ để so sánh địa chỉ chứa trong con trỏ.

• Thường dùng để xác định khi con trỏ = NULL.

Trang 12

Truyền tham số con trỏ cho hàm

Trong phần khai báo và định nghĩa hàm, khai báo

Trong lời gọi hàm, ta phải cung cấp biểu thức có trị

Trang 13

Con trỏ và mảng

Con trỏ và mảng có mối quan hệ chặt chẽ:

Tên mảng cũng như hằng con trỏ (constant pointer).

Có thể dùng chỉ số đối với các con trỏ.

Trang 14

int x = *pa; //copy content of a[0] to x

int y = *(pa+1); //copy content of a[1] to y

Trang 15

Con trỏ và mảng

a là địa chỉ của a[0]

 pa = &a[0]; có thể viết: pa = a;

 *(a+i) == *(pa+i)

Trang 16

9 void getArray(int *a, int size){

10 for(int i=0; i<size; i++) {

11 printf(“a[%d]=“, i);

12 scanf(“%d”, &a[i]);

Trang 17

Mảng con trỏ

 Kiểu phần tử của biến mảng có thể là kiểu con trỏ Các biến có địa chỉ chứa trong các phần tử mảng con trỏ là một mảng, nhưng có vùng nhớ không liên tục.

 Thường dùng để lưu mảng của chuỗi.

 Ví dụ: char * s[5] = {“Orange”, “Mango”,

“Coconut”, “Longan”, “Banana”};

 Mỗi phần tử của s trỏ đến char * (1 chuỗi)

Trang 20

Con trỏ đa cấp

 Bản thân biến trỏ cũng có địa chỉ, do đó, có thểchứa địa chỉ của nó trong 1 biến trỏ khác, gọi làcon trỏ trỏ đến con trỏ, hay con trỏ 2 cấp

 Số lượng dấu “*” xác định cấp của 1 biến trỏ

 Con trỏ 2 cấp có liên quan mật thiết với mảng 2chiều

 Ví dụ:

int a[2][3];

int **p = new int *[2];

p[0] = a[0];

Trang 21

Cấp phát động

 Cấp phát tĩnh: Cấp phát vùng nhớ lúc biên dịch

chương trình

 Cấp phát động: Cấp phát vùng nhớ lúc thựchiện chương trình

 Vùng nhớ của các đối tượng (biến) cấp phátđộng sẽ được đặt tại HEAP

 Trong C, dùng các hàm malloc, calloc, realloc,

… được khai báo trong thư viện <alloc.h>,

Trang 22

 void *: có thể cấp phát vùng nhớ cho kiểu dữ liệu bất kỳ.

VD:int* pi;

int size = 5;

pi = (int*)malloc(size * sizeof(int));

Trang 24

Cấp phát động

 Trong C++, dùng toán tử new:

 Để cấp phát vùng nhớ trên HEAP có kích thước = sizeof(<type>)

<biến> = new <type>;

 Để cấp phát vùng nhớ trên HEAP có kích thước = sizeof(<type>) * n

<biến> = new <type> [n];

 Ví dụ:

int *x = new int;

int *a = new int [5];

Trang 25

void free (void *ptr);

Trang 27

void randomInit(int* a, int n);

void output(int* a, int n);

Trang 30

void randomInit(int** a, int m, int n);

void output(int** a, int m, int n);

Trang 31

cout << "Cho biet so dong ? : "; cin >> m;

cout << "Cho biet so cot ? : "; cin >> n;

a = new int * [m];

for (int i = 0; i < m; i++)

a[i] = new int [n];

randomInit(a, m, n);

Trang 33

Con trỏ hàm

 Trong C/C++, tên hàm là địa chỉ vùng nhớ củachỉ thị đầu tiên của hàm, do đó ta có thể gán giátrị địa chỉ này cho 1 biến trỏ có kiểu cùng kiểuvới kiểu giá trị trả về của hàm Đó gọi là con trỏhàm

 Có thể gọi thực hiện một cách gián tiếp một hàmnào đó thông qua con trỏ hàm

 Hàm có thể được dùng làm tham số cho mộthàm khác nhờ vào con trỏ hàm

Trang 34

Con trỏ hàm

 Ví dụ: Giả sử có các khai báo:

int a, b;

void swap(int * px, int * py);

void (* pf)(int *, int *);

pf = swap();

pf (&a, &b);

Trang 36

Bài tập

- Tính tổng các phần tử trong mảng

- Tính giá trị trung bình của mảng

- Sắp xếp mảng theo thứ tự tăng dần, giảm dần

- Sắp xếp mảng theo thứ tự tăng dần và loại bỏ

các phần tử trùng nhau

- Liệt kê các phần tử là số chẵn, số lẻ, số âm, số

dương, số nguyên tố

- Đếm số lượng các phần tử là số chẵn, số lẻ,

số âm, số dương, số nguyên tố

Viết chương trình áp dụng các hàm trên

Trang 39

Bài tập

5 Viết chương trình xử lý chuỗi ký tự gồm các chức

năng sau: (Dùng con trỏ để cài đặt, không dùng hàm thư viện)

- Tính chiều dài của chuỗi nhập vào.

- Sao chép 2 chuỗi với nhau.

- So sánh 2 chuỗi với nhau.

- Tìm 1 ký tự trong chuỗi nhập.

- Tìm chuỗi con trong chuỗi nhập.

- Thêm chuỗi con vào chuỗi nhập tại vị trí k.

Trang 40

Bài tập

- Đảo ngược chuỗi nhập

- Kiểm tra 2 chuỗi nhập có bằng nhau?

- Kiểm tra chuỗi nhập có đối xứng?

- Đếm tần số xuất hiện của các ký tự trong chuỗi

nhập

- Đếm số từ trong chuỗi nhập

6 Viết chương trình nhập vào danh sách các từ

tiếng Anh, sắp xếp các từ theo thứ tự tăngdần

Ngày đăng: 08/03/2019, 12:52

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w