PowerPoint Template

Tài liệu tương tự
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 9. Vào ra dữ liệu trong C Các lệnh vào ra dữ liệu C cun

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 13. Hàm Nội dung 1. Khái niệm hàm 2. Khai báo và sử dụn

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 11. Mảng và xâu kí tự Nội dung 1. Mảng 2. Xâu kí tự 2 1

TRƯỜnG ĐẠI HỌC BÁCH KHOA HÀ nội VIỆn CÔnG nghệ THÔnG TIn VÀ TRUYỀn THÔnG TIN HỌC ĐẠI CƯƠNG Bài 10. Các cấu trúc lập trình trong C Nội dung 1. Cấu trúc

C++ và lập trình hướng đối tượng C++ và lập trình hướng đối tượng Bởi: Phạm Văn Ất Làm việc với TC Các ví dụ trong cuốn sách này sẽ viết và thực

Microsoft Word - danh-sach-lien-ket-doi-trong-c.docx

Danh sách tuyến tính kiểu hàng đợi Danh sách tuyến tính kiểu hàng đợi Bởi: Khoa CNTT ĐHSP KT Hưng Yên ĐỊNH NGHĨA Hàng đợi là một vật chứa (container)

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 11. Tệp tin Nội dung 1. Khái niệm cơ bản 2. Các thao tá

NHẬP MÔN LẬP TRÌNH C Phân bổ thời gian thực hành (12 tuần, 5 tiết/tuần) Tuần 01-02: Chương 1. Các thành phần cơ bản của Ngôn ngữ C Chương 2. Nhập xuất

View, Procedure, Function & Trigger

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 5. Kiểu dữ liệu và biểu thức trong C Nội dung 1. Các ki

Hàm và lớp template trong Lập trình hướng đối tượng Hàm và lớp template trong Lập trình hướng đối tượng Bởi: unknown Trong phần này, chúng ta tìm hiểu

Lập trình và ngôn ngữ lập trình

Tài liệu Hướng dẫn sử dụng

Bài 7. Con trỏ Mục tiêu: 1. Luyện tập sử dụng con trỏ và địa chỉ của các biến 2. Sử dụng con trỏ khi thao tác với mảng. Giới hạn: không dùng các thư v

Slide 1

Hệ điều hành Bài tập tuần 6 1 Quản lý bộ nhớ Bài tập 1 : Xem thông tin bộ nhớ 1. Sử dụng top, ps đọc thông tin về kích thước vùng nhớ của 1 tiến trình

OpenStax-CNX module: m Giới thiệu về ngôn ngữ C và môi trường turbo C 3.0 ThS. Nguyễn Văn Linh This work is produced by OpenStax-CNX and licens

Trường ĐHBK Hà Nội Khoa Điện Bộ môn Điều khiển Tự động Tài liệu hướng dẫn thực hành: KĨ THUẬT LẬP TRÌNH C/C++ Bài 1: Lập trình cơ sở 1 Mục đích bài th

Template and Exception Template and Exception Bởi: Thanh Hiền Vũ TEMPLATE Trong phần này, chúng ta tìm hiểu về một trong các đặc tính còn lại của C++,

PowerPoint Template

NGÔN NGƯ LÂ P TRIǸH Biên tập bởi: nguyenvanlinh

Chương 1:

Cây và cây nhị phân Cây và cây nhị phân Bởi: Trần Hạnh Nhi CẤU TRÚC CÂY Định nghĩa 1: cây là một tập hợp T các phần tử (gọi là nút của cây) trong đó c

Microsoft Word - cau-truc-du-lieu-hang-doi.docx

Những cơ sở của ngôn ngữ C# Những cơ sở của ngôn ngữ C# Bởi: phamvanviet truonglapvy Trong chương này sẽ trình bày về hệ thống kiểu trong C#; phân biệ

Lkgjlfjq?etyuiiofjkfjlsfjkslddghdgertt

Chương trình dịch

Microsoft Word - su_dung_sqlite_voi_php.docx

UART0

Chương II - KIẾN TRÚC HỆ ĐIỀU HÀNH

Chương trình dịch

VẤN ĐỀ 4. PHƯƠNG TRÌNH ĐƯỜNG THẲNG TRONG KHÔNG GIAN 1. Viết phương trình tham số và chính tắc của đường thẳng đi qua điểm ; ; u a;b;c. vectơ chỉ phươn

HOC360.NET - TÀI LIỆU HỌC TẬP MIỄN PHÍ 252 đề Toán luyện thi Violympic lớp 3 Đề thi tự luyện nâng cao lớp 3 Bài 1: Tìm x a) x = b) x + 5

Hướng dẫn Bắt đầu Nhanh Microsoft Publisher 2013 trông khác với các phiên bản trước, vì vậy chúng tôi tạo ra hướng dẫn này để giúp bạn dê dàng nắm bắt

Microsoft Word - QCHV 2013_ChinhThuc_2.doc

CÁC DẠNG TOÁN 11 CHƯƠNG III. QUAN HỆ VUÔNG GÓC Câu 1. Câu 2. Trong không gian, A. vectơ là một đoạn thẳng. B. vectơ là một đoạn thẳng đã phân biệt điể

BÀI TẬP THỰC HÀNH

Kiến trúc tập lệnh1

Array, Indexer và Collection Array, Indexer và Collection Bởi: phamvanviet truonglapvy Mảng (Array) Mảng là một tập hợp các phần tử có cùng kiểu, được

Bài tập thực hành Chuyên đề 1 CNPM - Java Khoa CNTT- Trường ĐH Công nghệ TP.HCM Lab 01: LẬP TRÌNH JAVA CƠ BẢN VỚI NET BEANS A. MỤC TIÊU: Hướng dẫn tải

PowerPoint Presentation

ĐỀ THI GIỮA KỲ MÔN: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Đề số 1. Thời gian 120 phút (Sinh viên KHÔNG được sử dụng tài liệu hay máy tính ) Xây dựng lớp STRING và

PowerPoint Template

CÁC DẠNG BÀI THI VIOLYMPIC LỚP 5

Lớp và đối tượng-các hàm và các lớp friend Lớp và đối tượng-các hàm và các lớp friend Bởi: Thanh Hiền Vũ CÁC HÀM VÀ CÁC LỚP friend Một hàm friend của

HƯỚNG DẪN SỬ DỤNG WEBSITE FSHARE V2 Hươ ng dâ n sư du ng Fshare 2 1/31

HỘI THI TIN HỌC TRẺ TỈNH AN GIANG ĐỀ CHÍNH THỨC ĐỀ THI LÝ THUYẾT BẢNG A - KHỐI TIỂU HỌC Khóa ngày: Thời gian : 20 phút (không kể thời gian

KIỂM TOÁN NHÀ NƯỚC CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc Số: 1173/QĐ-KTNN Hà Nội, ngày 27 tháng 7 nă

Trung Tâm Gia Sư Tài Năng Việt Đề Số 1 Câu 1: Sau khi thực hiện đoạn chương trình sau, giá trị của biến S bằng bao nhiêu: S

Câu lệnh (statement) Câu lệnh (statement) Bởi: Khuyet Danh Trong C# một chỉ dẫn lập trình đầy đủ được gọi là câu lệnh. Chương trình bao gồm nhiều câu

ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH Ths. Ngô Quốc Nhàn BÀI GIẢNG TOÁN CAO CẤP A2 Hệ Đại Học Ngành: Thời lượng giảng dạy: 45 tiết. TP.HỒ CHÍ MINH

THƯ VIỆN PHÁP LUẬT

000.Bia

Microsoft Word - kieu_du_lieu_trong_jdbc.docx

BỘ GIAO THÔNG VẬN TẢI TRƢỜNG ĐẠI HỌC HÀNG HẢI BỘ MÔN: KHOA HO C MA Y TI NH KHOA: CÔNG NGHỆ THÔNG TIN BÀI GIẢNG KỸ THUẬT LẬP TRÌNH C TÊN HỌC PHẦN : KỸ

Microsoft Word - NOI DUNG BAO CAO CHINH TRI.doc

Microsoft Word - QCHV_2013_vlvh_chinhthuc.doc

Hãy chọn phương án đúng CÂU HỎI TRẮC NGHIỆM TIN HỌC 7 HK1 Câu 1: Bảng tính thường được dùng để: a. Tạo bảng điểm của lớp em b. Bảng theo dõi kết quả h

BỘ GIÁO DỤC VÀ ĐÀO TẠO

hoc360.net Tài liệu học tập miễn phí CÁC DẠNG BÀI THI VIOLYMPIC LỚP 5 BÀI SỐ 1: Tìm một phân số biết mẫu số hơn tử số 45 đơn vị và biết phân số đó có

ETH-MOD-T BỘ CHUYỂN ĐỔI GIAO THỨC HAI CHIỀU MODBUS - ETHERNET 1 Thông tin chung: Tất cả dữ liệu của đồng hồ và relay trong đường dây được kết nối với

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC MỞ THÀNH PHỐ HỒ CHÍ MINH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc QUY ĐỊNH Về tổ chức và quản

Tổng quan Bài Độ khó nghĩ / cài Tag unsigned s Result A. Invariant Sets / Đồ thị +4 / 185 B. Scheduling Events / DP +2 / 11 C. XOR / Tham lam, bitwise

Tìm hiểu ngôn ngữ lập trình Visual Basic Tìm hiểu ngôn ngữ lập trình Visual Basic Bởi: Khuyet Danh Tìm hiểu ngôn ngữ lập trình Visual Basic Tổng quan

KỸ NĂNG SỬ DỤNG THƯ VIỆN HIỆU QUẢ Hà Nội, 2019

Microsoft Word - bo_tien_xu_ly_trong_c.docx

MỘT SỐ LƯU Ý KHI DẠY CÁC TIẾT ÔN TẬP CHƯƠNG Môn Tin học cung cấp cho học sinh những kiến thức phổ thông về ngành khoa học tin học, hình thành và phát

Hướng dẫn cách tạo trích dẫn của GOOGLE SCHOLAR I. Google Scholar là gì? Google Scholar cung cấp một phương pháp đơn giản để tìm kiếm các tài liệu man

THANH TÙNG BÀI TOÁN CHÌA KHÓA GIẢI HÌNH HỌC OXY Trong các năm gần đây đề thi Đại Học

MÁY TOÀN ĐẠC ĐIỆN TỬ LEICA TCR1101

Ch­ng I

Khóa học LĐ Nâng cao 2018 Sinh học Thầy Phan Khắc Nghệ ĐỀ THI THỬ ĐẠI HỌC NÂNG CAO MÔN SINH SỐ 11 ID: LINK XEM LỜI

Invoice consultation CMA CGM Group Business Thông báo hóa đơn CMA-CGM ANL CNC

SM-G925F Sách hướng dẫn sử dụng Vietnamese. 04/2015. Rev.1.0

BỘ VĂN HÓA, THỂ THAO VÀ DU LỊCH TRƯỜNG ĐẠI HỌC VĂN HÓA TP. HỒ CHÍ MINH & QUY CHẾ HỌC VỤ Tài liệu dành cho sinh viê

Trường Tiểu học Trung Lập Thượng Khối 1 Giáo viên: Nguyễn Thanh Quang Ngày dạy: thứ, ngày tháng năm 201 Môn Mỹ thuật tuần 19 Chủ đề EM VÀ NHỮNG VẬT NU

Chöông 1 (tt.)

BỘ GIÁO DỤC VÀ ĐÀO TẠO TÀI LIỆU HƯỚNG DẪN SỬ DỤNG CHỨC NĂNG ĐIỀU CHỈNH NGUYỆN VỌNG ĐĂNG KÝ XÉT TUYỂN TRỰC TUYẾN (Dành cho Thí sinh Điều chỉnh nguyện v

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG E-LEARNING Version 1.2 Công Ty TNHH Uratek Website: TP.HCM, 11/2017

Lớp đối tượng String Lớp đối tượng String Bởi: Khuyet Danh Ngôn ngữ C# hỗ trợ khá đầy đủ các chức năng của kiểu chuỗi mà chúng ta có thể thấy được ở c

Mười Vạn Câu Hỏi Vì Sao?: Toán Học Chia sẽ ebook : Tham gia cộng đồng chia sẽ sách : Fanpage :

Ngân hàng TMCP Kỹ thương Việt Nam

?ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC GIÁO DỤC MAI QUANG HUY QUẢN LÝ ĐÀO TẠO GIÁO VIÊN Ở TRƯỜNG ĐẠI HỌC GIÁO DỤC - ĐHQGHN THEO TIẾP CẬN GIÁO DỤC SO

Đại Học Y Dược Thành Phố Hồ Chí Minh Khoa Y Trung Tâm Huấn Luyện Nâng Cao Mô Phỏng Lâm Sàng SỔ TAY SINH VIÊN Tháng

Slide 1

Microsoft Word - KY YEU Hoi thao Lien Hiep nam thanh + dung.doc

Chiến lược ôn thi THPT quốc gia môn Toán 2016

Ngày xưa - Thành Bắc Ninh Tỉnh Bắc Ninh là cửa ngõ của cố đô Thăng Long, là vùng đất trung chuyển giữa kinh đô xưa với miền địa đầu giáp giới Trung Qu

Microsoft Word - Lab09 - WebSieuthisach.doc

TRƯỜNG TRUNG HỌC PHỔ THÔNG FPT BÀI KIỂM TRA NĂNG LỰC TƯ DUY THAM KHẢO Phần 1 Câu 1 Trung bình cộng của ba số là V. Nếu một trong ba số là Z, một số kh

CHUYÊN ĐỀ 7 KIỂM ĐỊNH CHẤT LƯỢNG GIÁO DỤC VÀ ĐÁNH GIÁ NGOÀI TRƯỜNG MẦM NON ThS. Hồ Đắc Thụy Thiên Thi

CHÍNH PHỦ CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc Số: 119/2018/NĐ-CP Hà Nội, ngày 12 tháng 9 năm 2018 N

Trường Đại học Dân lập Văn Lang - Nội san Khoa học & Đào tạo, số 5, 11/2005 NHÓM HỌC TẬP SÁNG TẠO THS. NGUYỄN HỮU TRÍ Trong bài viết này tôi muốn chia

PHƯƠNG TIỆN DẠY HỌC

TRƯỜNG ĐẠI HỌC NAM CẦN THƠ QUY CHẾ ĐÀO TẠO ĐẠI HỌC & CAO ĐẲNG THEO HỆ THỐNG TÍN CHỈ (17/VBHN-BGDĐT, 15/05/14) Trình bày : Ths. Võ Văn Mẫn Ths. Lê Quỳn

Bản ghi:

KHOA CÔNG NGHỆ THÔNG TIN Bài giảng: KỸ THUẬT LẬP TRÌNH Bài 4: CON TRỎ C Ngôn ngữ lập trình số 1 thế giới Giảng viên: Th.S Dương Thành Phết Email: phetcm@gmail.com Website: http://www.thayphet.net Mobile: 0918158670

MỤC TIÊU Trình bày được khái niệm về con trỏ; Thực hiện được khai báo và sử dụng biến kiểu con trỏ; Xử lý được các phép toán trên mảng một chiều, hai chiều theo kiểu con trỏ; Thực hiện được các giải thuật trên mảng 1 chiều, 2 chiều như tìm kiếm, sắp xếp, thêm phần tử, xóa phần tử...theo kiểu con trỏ; Thao tác được con trỏ với kiểu dữ liệu có cấu trúc. 2

NỘI DUNG 1. Khái niệm về địa chỉ ô nhớ và con trỏ 2. Khai báo và sử dụng biến con trỏ 3. Các phép toán trên con trỏ 4. Sử dụng con trỏ để cấp phát và thu hồi bộ nhớ 5. Con trỏ và mảng một chiều 6. Con trỏ và mảng hai chiều 7. Con trỏ với kiểu có cấu trúc (struct) 3

4.1. KHÁI NIỆM VỀ ĐỊA CHỈ Ô NHỚ VÀ CON TRỎ Biến tĩnh: Các biến có kiểu cơ sở, kiểu cấu trúc là biến tĩnh. Khi khai báo biến tĩnh, một lượng ô nhớ cho các biến này sẽ được cấp phát cố định. Biến tĩnh sẽ tồn tại trong suốt thời gian thực thi chương trình. Ví dụ : int x=4 ; Một số hạn chế khi sử dụng các biến tĩnh: Cấp phát ô nhớ dư, gây ra lãng phí. Cấp phát ô nhớ thiếu, chương trình thực thi bị lỗi. 4

4.1. KHÁI NIỆM VỀ ĐỊA CHỈ Ô NHỚ VÀ CON TRỎ Biến động: Khắc phục những hạn chế của biến tĩnh Chỉ phát sinh trong quá trình thực hiện chương trình (không phát sinh đầu chương trình). Khi chạy chương trình, vùng nhớ và địa chỉ vùng nhớ được cấp phát cho biến có thể thay đổi. Sau khi sử dụng xong có thể giải phóng để tiết kiệm bộ nhớ. 5

4.1. KHÁI NIỆM VỀ ĐỊA CHỈ Ô NHỚ VÀ CON TRỎ Biến con trỏ: Vì các biến động không có địa chỉ nhất định nên không thể truy cập được. Nên ngôn ngữ C cung cấp loại biến để khắc phục là biến con trỏ (pointer) với các đặc điểm: Con trỏ không chứa dữ liệu mà chỉ chứa địa chỉ của ô nhớ chừa dữ liệu. Kích thước của biến con trỏ không phụ thuộc vào kiểu dữ liệu, cố định là 2 byte. 6

4.2. KHAI BÁO VÀ SỬ DỤNG BIẾN CON TRỎ 4.2.1. Khai báo biến con trỏ Cú pháp: <Kiểu> * <Tên con trỏ> Ví dụ 1: int a, b, *pa, *pb; Khai báo 2 biến a,b có kiểu int và 2 biến pa, pb là 2 biến con trỏ trỏ đền 2 biến chứa giá trị kiểu int. Ví dụ 2: float f, *pf; Khai báo biến f kiểu float và biến pf là con trỏ, trỏ đề biến chứa giá trị kiểu float 7

4.2. KHAI BÁO VÀ SỬ DỤNG BIẾN CON TRỎ 4.2.2. Các thao tác trên con trỏ Gán địa chỉ cho biến con trỏ: Toán tử & dùng để định vị con trỏ đến địa chỉ của một biến. Cú pháp: Gán địa chỉ của biến cho con trỏ. Ví dụ: int *xp, x = 4 ; xp = &x <Tên biến con trỏ>=&<tên biến> Gán địa chỉ của biến x cho con trỏ xp. 8

4.2. KHAI BÁO VÀ SỬ DỤNG BIẾN CON TRỎ 4.2.2. Các thao tác trên con trỏ Truy cập nội dung biến con trỏ: Để truy cập nội dung của ô nhớ mà con trỏ chỉ tới, cú pháp: *<Tên biến con trỏ> Vậy *<Tên biến con trỏ> là một biến có kiểu được mô tả trong phần khai báo biến con trỏ. Ví dụ: int x=100; *ptr; ptr= &x; //ptr chua gia tri la dia chi bien x int y= *ptr; //y=100 9

4.2. KHAI BÁO VÀ SỬ DỤNG BIẾN CON TRỎ #include <stdio.h> #include <conio.h> void main() int a,b,*pa,*pb; a= 2 ; b= 3 ; printf("\ngia tri cua bien a=%d \ngia tri cua bien b=%d ",a,b); pa=&a; pb=&b; printf("\nnoi dung cua o nho con tro pa tro toi=%d",*pa); printf("\nnoi dung cua o nho con tro pb tro toi=%d ",*pb); *pa=20; /* Thay đổi giá trị của *pa*/ *pb=20; /* Thay đổi giá trị của *pb*/ printf("\ngia tri moi cua bien a=%d \n Gia tri moi cua bien b=%d ",a,b); /* a, b thay đổi theo*/ getch(); 10

4.3. CÁC THAO TÁC TRÊN CON TRỎ 4.3.2. Tăng giảm địa chỉ: Cộng (+), trừ (-) 1 con trỏ với số nguyên N; Trả về là 1 con trỏ trỏ đến vùng nhớ cách vùng nhớ của con trỏ hiện tại N phần tử. Ví dụ: float x[30], *px; px = &x[10]; px là con trỏ float trỏ đến phần tử x[10]. px+i trỏ đến phần tử x[10+i] px-i trỏ đến phần tử x[10-i]. Phép trừ 2 con trỏ cùng kiểu sẽ trả về 1 giá trị nguyên là khoảng cách (số phần tử) giữa 2 con trỏ. Con trỏ NULL: là con trỏ không chứa địa chỉ nào cả. Lưu ý: Không thể cộng 2 con trỏ với nhau. 11

4.3. CÁC THAO TÁC TRÊN CON TRỎ 4.3.3. Truy cập bộ nhớ: Nguyên tắc: Con trỏ float truy nhập 4 byte. Con trỏ int 2 byte. Con trỏ char 1 byte. Ví dụ float *pf ; Khi đó : int *pi ; char *pc ; Nếu pf trỏ đến byte 10001, thì *pf biểu thị vùng nhớ 4 byte liên tiếp từ byte 10001 10004. Nếu pi trỏ đến byte 10001, thì *pi biểu thị vùng nhớ 2 byte liên tiếp từ byte 10001 byte 10002 12

4.3. CÁC THAO TÁC TRÊN CON TRỎ 4.3.4. Phép so sánh Cho phép so sánh 2 con trỏ cùng kiểu: p1<p2: Địa chỉ p1 trỏ tới thấp hơn địa chỉ p2 trỏ tới p1=p2: Địa chỉ p1 trỏ tới bằng địa chỉ p2 trỏ tới p1>p2: Địa chỉ p1 trỏ tới cao hơn địa chỉ p2 trỏ tới. 13

4.4. SỬ DỤNG CON TRỎ C.PHÁT/T.HỒI BỘ NHỚ Để cấp phát bộ nhớ động, sử dụng các hàm trong thư viện stdlib.h hoặc alloc.h. malloc calloc realoc new Khi dùng xong phải giải phòng thu hồi bộ nhớ. khi cấp phát dùng hàm malloc, calloc, realoc, thì khi giải phóng sử dụng hàm free. Khi cấp phát sử dụng toán tử New, khi giải phóng bộ nhớ ta phải dùng toán tử delete 14

4.4. SỬ DỤNG CON TRỎ C.PHÁT/T.HỒI BỘ NHỚ 4.4.1. Các hàm cấp phát vùng nhớ Hàm malloc Cú pháp: void *malloc( size_t n); Hàm xin cấp phát vùng nhớ cho n phần tử, mỗi phần tử có kích thước là size_t. Nếu thành công hàm trả về địa chỉ đầu vùng nhớ được cấp phát. Khi không đủ vùng nhớ hàm trả về trị NULL. 15

4.4. SỬ DỤNG CON TRỎ C.PHÁT/T.HỒI BỘ NHỚ #include <stdio.h> #include <string.h> #include <alloc.h> #include <process.h> void main( ) char *str; /* allocate memory for string */ str = (char *) malloc(10); if( str==null) printf("not enough memory to allocate buffer\n"); exit(1); /* terminate program if out of memory */ strcpy(str, "Hello"); /* copy "Hello" into string */ printf("string is %s\n", str); /* display string */ free(str); /* free memory */ 16

4.4. SỬ DỤNG CON TRỎ C.PHÁT/T.HỒI BỘ NHỚ 4.4.1. Các hàm cấp phát vùng nhớ Hàm calloc Cú pháp: void *calloc(size_t nitems, size_t size); Cấp phát vùng nhớ nitems*size byte. Nếu thành công hàm trả về địa chỉ đầu vùng nhớ được cấp phát. Khi không đủ bộ nhớ hàm trả về NULL. 17

4.4. SỬ DỤNG CON TRỎ C.PHÁT/T.HỒI BỘ NHỚ #include <stdio.h> #include <alloc.h> #include <string.h> void main(void) char *str = NULL; /* allocate memory for string */ str = (char *) calloc(10, sizeof(char)); strcpy(str, "Hello"); /* copy "Hello" into string */ printf("string is %s\n", str); /* display string */ free(str); /* free memory */ Hàm calloc cấp phát vùng nhớ và khởi tạo tất cả các bit trong vùng nhớ mới cấp phát về 0. Hàm malloc chỉ cấp phát vùng nhớ. 18

4.4. SỬ DỤNG CON TRỎ C.PHÁT/T.HỒI BỘ NHỚ 4.4.1. Các hàm cấp phát vùng nhớ Hàm realloc Cú pháp: void* realloc(void *ptr, unsigned size); ptr: trỏ đến đến vùng nhớ đã được cấp phát trước đó. size: là số byte cần cấp phát lại. Hàm thay đổi kích thước vùng nhớ đã cấp phát trước đó. Phần dữ liệu trên vùng nhớ cũ được chuyển đến vùng nhớ mới. Ví dụ: int a, *pa; pa = (int*) malloc (10) ; /*Xin cấp phát vùng nhớ có kích thước (10 x 2 ) byte*/ pa = realloc (pa, 16); /* Xin cấp phát lại vùng nhớ có kích thước 16 x2 byte*/ 19

4.4. SỬ DỤNG CON TRỎ C.PHÁT/T.HỒI BỘ NHỚ 4.4.2. Thu hồi bộ nhớ động Khi sử dụng con trỏ nếu cấp phát bộ nhớ thì bắt buộc phải trả lại bộ nhớ. Để thu hồi bộ nhớ ta có thể dùng hàm free hoặc toán tử delete. Lưu ý : Khi cấp phát bộ nhớ nếu dùng hàm malloc, calloc, realoc, thì khi giải phóng dùng hàm free. Khi cấp phát dùng toán tử New, thì khi giải phóng dùng toán tử delete 20

4.4. SỬ DỤNG CON TRỎ C.PHÁT/T.HỒI BỘ NHỚ 4.4.3. Toán tử sizeof Toán tử sizeof cho biết kích thước (tính theo byte) của một kiểu dữ liệu hay một đối tượng dữ liệu. Kiểu dữ liệu có thể là kiểu chuẩn hay kiểu dữ liệu được định nghĩa. Đối tượng dữ liệu bao gồm tên biến, tên mảng, biến struct, Khai báo : sizeof (<đối tượng dữ liệu>) sizeof (<kiểu dữ liệu>) 21

4.4. SỬ DỤNG CON TRỎ C.PHÁT/T.HỒI BỘ NHỚ 4.4.3. Toán tử sizeof typedef float KieuThuc; struct Sinhvien char masv[8]; char mamh[5]; int lanthi; float diem; sv; sizeof (int); //cho trị 2 sizeof (KieuThuc); //cho trị 4 sizeof (sv); //cho trị 19 22

4.5. CON TRỎ VÀ MẢNG 1 CHIỀU Giữa mảng và con trỏ có một sự liên hệ rất chặt chẽ. Những phần tử của mảng có thể được xác định bằng chỉ số trong mảng, bên cạnh đó chúng cũng có thể được xác lập qua biến con trỏ. 4.5.1. Truy cập các phần tử mảng theo dạng con trỏ Quy tắc: &<Tên mảng>[0] <Tên mảng> &<Tên mảng> [<Vị trí>] <Tên mảng> + <Vị trí> <Tên mảng>[<vị trí>] *(<Tên mảng> + <Vị trí>) 23

4.5. CON TRỎ VÀ MẢNG 1 CHIỀU #include <stdio.h> #include <conio.h> void NhapMang (int a[], int n) /* Nhập mảng bình thường*/ for( int i=0;i<n ;i++) printf("phan tu thu %d: ",i); scanf("%d",&a[i]); void NhapContro (int *a, int n) /* Nhập mảng theo dạng con trỏ*/ for(i=0;i<n ;i++) printf("phan tu thu %d: ",i); scanf("%d",a+i); 24

4.5. CON TRỎ VÀ MẢNG 1 CHIỀU 4.5.2. Truy cập từng phần tử đang được quản lý bởi con trỏ theo dạng mảng <Tên biến>[<vị trí>] *(<Tên biến> + <Vị trí>) &<Tên biến>[<vị trí>] (<Tên biến> + <Vị trí>) Trong đó: <Tên biến> là biến con trỏ, <Vị trí> là 1 biểu thức số nguyên. 25

4.5. CON TRỎ VÀ MẢNG 1 CHIỀU 4.5.2. Truy cập từng phần tử đang được quản lý bởi con trỏ theo dạng mảng #include <stdio.h> #include <alloc.h> #include <conio.h> void main() int *a; a = (int*)malloc (10); for(i=0;i<10;i++) a[i] = 2*i; printf("truy cap theo kieu mang: "); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\ntruy cap theo kieu con tro: "); for(i=0;i<10;i++) printf("%d ",*(a+i)); getch(); 26

4.5. CON TRỎ VÀ MẢNG 1 CHIỀU Bài toán 1: Dùng phương pháp con trỏ. Viết chương trình: Nhập mảng số nguyên gồm n phần tử (n<=100 ). Xuất ra mảng số nguyên vừa nhập. Tính tổng các phần tử có trong mảng. int * p; // khai báo biến con trỏ p để quản lý mảng p = ( int *) malloc ( n ); // xin cấp phát (n x 2 ) byte cho p. 27

4.5. CON TRỎ VÀ MẢNG 1 CHIỀU #include<stdio.h> #include<conio.h> #include<stdlib.h> void Nhapsopt ( int &n ) do printf ( Nhap so phan tu: "); scanf( %d ", &n); if (n<=0) printf ( Nhap sai, nhap lai ); while(n<=0); void Capphat ( int *p, int n) p = ( int*) calloc ( n, sizeof ( int) ); if (p==null) printf(" ko du bo nho"); getch( ); exit(1); void Nhapmang (int * a, int n) for (int i=0 ; i<n ; i++) printf( nhap a[%d]:", i ); scanf ( %d ", (a+ i)); void Xuatmang ( int * a, int n) for ( int i=0 ; i<n ; i++ ) printf ("%4d", *( a+i ) ); void main() int *a, n; Nhapsopt (n); Capphat(a,n); Nhapmang( a, n); Xuatmang(a, n); free(a); 28

4.6. CON TRỎ VÀ MẢNG 2 CHIỀU Bài toán 2: Dùng phương pháp con trỏ. Viết chương trình: Nhập vào một ma trận số nguyên gồm m dòng, n cột (m, n<=100 ). Xuất ra ma trận số nguyên vừa nhập. Tính tổng các phần tử có trong ma trận. 29

4.6. CON TRỎ VÀ MẢNG 2 CHIỀU Cách 1: int *a ; // khai báo con trỏ a để quản lý ma trận a = (int *) malloc (m*n)); // cấp phát bộ nhớ Để truy cập đến phần tử a [i][j]: *(a + i*n + j); 30

4.6. CON TRỎ VÀ MẢNG 2 CHIỀU #include<stdio.h> #include<conio.h> #include<stdlib.h> void Nhapdongcot ( int &m, int &n ) do printf ( nhap so dong: "); scanf( %d ", &m); if (m<=0 m >100) printf ( Nhap sai, nhap lai: ); while(m<=0 m>100); do printf ( nhap so cot: ); scanf ( %d ", &n); if( n<=0 n>100 ) printf ( Nhap sai, nhap lai: ); while(n<=0 n>100); void Capphat ( int *a, int m,int n) a=( int*) calloc (m*n, sizeof (int)); if(a==null) printf(" ko du bo nho"); getch( ); exit(1); void Nhapmang (int * a, int m, int n) for (int i=0 ; i<m ; i++) for ( int j=0 ; j<n ; j++) printf( Nhap a[%d][%d]:",i,j); scanf ( %d ", (a+ i*n + j ) ); 31

4.6. CON TRỎ VÀ MẢNG 2 CHIỀU void Xuatmang ( int * a, int m, int n) for ( int i=0 ; i<m ; i++ ) for ( int j=0 ; j<n ; j++) printf ("%4d", *( a+i *n +j ) ); printf("\n"); long Tinhtong ( int * a, int m, int n) for ( int i=0 ; i<m ; i++ ) for ( int j=0 ; j<n ; j++) s = s+ *( a+i *n +j ) ; return s; void main() int *a, m,n; Nhapdongcot(m,n); Capphat(a,m,n); Nhapmang( a, m, n); Xuatmang(a, m, n); long kq=tinhtong(a,m,n); printf( Tong cac phan tu:%ld, kq); free(a); 32

4.6. CON TRỎ VÀ MẢNG 2 CHIỀU Cách 2: int **a ; // khai báo con trỏ a để quản lý ma trận a = (int **) calloc (m,sizeof(int*)); // cấp phát bộ nhớ Con trỏ *a quản lý các phần tử dòng 0: a[0][0], a[0][1], a[0][2],...a[0][n-1] Con trỏ *(a+1) quản lý các phần tử dòng 1: a[1][0], a[1][1],a[1][2],...a[1][n-1]... Con trỏ *(a+m-1) quản lý các phần tử dòng m-1: a[m-1][0], a[m-1][1], a[m-1][2],...a[m-1][n-1] *a a[0][0] a[0][1]... a[0][n-1] *(a+1) a[1][0] a[1][1]... a[1][n-1].......... *(a+m-1) a[m-1][0] a[m-1][1]... a[m-1][n-1] Con trỏ **a quản lý mảng con trỏ: *a,*(a+1),*(a+2)...,*(a+m-1) ** a * a * (a+1)... *(a+m-1) 33

4.6. CON TRỎ VÀ MẢNG 2 CHIỀU #include<stdio.h> #include<conio.h> #include<stdlib.h> void Nhapdongcot ( int &m, int &n ) do printf ( nhap so dong: "); scanf( %d ", &m); if (m<=0 m >100) printf ( Nhap sai, nhap lai: ); while(m<=0 m>100); do printf ( nhap so cot: ); scanf ( %d ", &n); if( n<=0 n>100 ) printf ( Nhap sai, nhap lai: ); while(n<=0 n>100); void Capphat ( int **a, int m,int n) a = ( int** ) calloc (m,sizeof( int* )); if(a==null) printf(" ko du bo nho"); getch( ); exit(1); for(int i=0;i<m;i++) a[ i]=(int *) calloc(n,sizeof(int)); if ( a[i] == NULL) printf(" ko du bo nho"); getch( ); exit(1); 34

4.6. CON TRỎ VÀ MẢNG 2 CHIỀU void Nhapmang (int** a, int m, int n) for (int i=0 ; i<m ; i++) for ( int j=0 ; j<n ; j++) printf( nhap a[%d][%d]:", i, j); scanf ( %d ", (*(a+i) + j ) ); void Xuatmang ( int ** a, int m, int n) for ( int i=0 ; i<m ; i++ ) for ( int j=0 ; j<n ; j++) printf ("%4d", *( *( a+i ) +j ) ); printf("\n"); void myfree ( int **a, int m ) for ( int i=0 ; i<m ; i++) free ( a[ i ] ) ; free (a); long Tinhtong ( int ** a, int m, int n) long s=0; for ( int i=0 ; i<m ; i++ ) for ( int j=0 ; j<n ; j++) s= s+ *(*( a+i ) +j ) ; return s; void main() int **a, m,n; Nhapdongcot(m,n); Capphat(a,m,n); Nhapmang( a, m, n); Xuatmang(a, m, n); long kq=tinhtong(a,m,n); printf( Tong cac phan tu:%ld, kq); myfree(a); getch(); 35

4.7. CON TRỎ VỚI KIỂU CÓ CẤU TRÚC Ví dụ 1: typedef struct DIEM char masv[8]; char mamh[5]; int lanthi; float diem; ; DIEM *p, x; /* p là con trỏ kiểu struct và x là biến struct */ p=&x; /* con trỏ p chứa địa chỉ của biến x */ Để truy cập đến các thành phần của struct thông qua con trỏ ta dùng 1 trong 2 cách sau: 36

4.7. CON TRỎ VỚI KIỂU CÓ CẤU TRÚC Cách 1: Cú pháp: Ví dụ : Cách 2: Cú pháp: Ví dụ : <tên con trỏ> -> <tên thành phần> printf("%f ", p ->diem); <(*<tên con trỏ>).<tên thành phần> printf("%f ", (*p).diem); 37

4.7. CON TRỎ VỚI KIỂU CÓ CẤU TRÚC Ví dụ 2:Viết chương trình nhập/xuất điểm. #include "stdio.h" #include "conio.h" struct DIEM char masv[8]; char mamh[5]; int lanthi; float diem; ; void main() struct DIEM x,*p; float tam; p=&x; printf("\nnhap ma so sinh vien :"); gets(p->masv); printf("nhap ma mon hoc : "); gets(p->mamh); printf("lan thi :"); scanf("%d ", &p->lanthi); printf("diem :"); scanf("%f ", &tam); p->diem=tam; printf("\nket qua:"); printf("\nma ssv:%s", (*p).masv); printf("\nma MH: %s", (*p).mamh); printf("\nlan thi :%d", (*p).lanthi); printf("\ndiem :%.2f ", (*p).diem); getch(); 38

4.7. CON TRỎ VỚI KIỂU CÓ CẤU TRÚC Truyền structure sang hàm #include "stdio.h" #include "conio.h" typedef struct DIEMTHI char masv[8]; char mamh[5]; int lanthi; float diem; ; void Nhap( DIEMTHI *px); void Xuat( DIEMTHI x); void main() DIEMTHI x; printf("\nnhap diem thi"); Nhap(&x); printf("\nxuat diem thi"); Xuat(x); getch(); void nhap( DIEMTHI *px) float tam; printf("\nma sinh vien :"); gets(px->masv); printf("ma mon hoc:"); gets(px->mamh); printf("lan thi:"); scanf("%d%*c", &px->lanthi); printf("diem thi:"); scanf("%f%*c", &tam); px->diem=tam; void xuat( DIEMTHI x) printf("\nma SV :%s", x.masv); printf("\nma MH:%s", x.mamh); printf("\nlan thi:%d", x.lanthi); printf("\ndiem thi:%.2f", x.diem); 39

4.8. BÀI TẬP SỬ DỤNG CON TRỎ Bài tập 1. 1. Hàm nhập mảng 1 chiều số nguyên gồm n phần tử (0<n<100) 2. Hàm nhập mảng 1 chiều số thực gồm n phần tử (0<n<100) 3. Viết hàm xuất mảng số nguyên n phần tử vừa nhập ở trên 4. Viết hàm xuất mảng số thực n phần tử vừa nhập ở trên 5. Tính tổng các phần tử có trong mảng 6. Tính tổng các phần tử chẵn có trong mảng 7. Tính tổng các phần tử lẻ có trong mảng 8. Tính tổng các phần tử nguyên tố có trong mảng 9. Tìm phần tử chẵn đầu tiên có trong mảng 10. Tìm phần tử lẻ đầu tiên có trong mảng 40

3.8. BÀI TẬP Bài tập 2. 11. Tìm phần tử nguyên tố đầu tiên có trong mảng 12. Tìm phần tử chẵn cuối cùng có trong mảng 13. Tìm phần tử chính phương cuối cùng có trong mảng 14. Tìm phần tử lớn nhất có trong mảng 15. Đếm số phần tử chẵn có trong mảng 16. Đếm số phần tử lớn nhất có trong mảng 17. In ra vị trí của phần tử lớn nhất đầu tiên có trong mảng 18. Thêm một phần tử vào đầu mảng. 19. Thêm một phần tử vào cuối mảng. 20. Thêm một phần tử vào vị trí x trong mảng. 41

3.8. BÀI TẬP Bài tập 3. 21. Xóa phần tử chẵn đầu tiên. 22. Xóa tất cả các phần tử lớn nhất trong mảng 23. Sắp xếp mảng tăng dần 24. Hàm nhập mảng 2 chiều các số nguyên gồm mxn (0< m,n < 100) 25. Hàm nhập mảng 2 chiều các số thực gồm mxn ( 0< m,n < 100) 26. Hàm xuất mảng 2 chiều các số nguyên mxn phần tử 27. Hàm xuất mảng 2 chiều các số thực mxn phần tử 28. Tính tổng các phần tử có trong mảng 29. Tính tổng các phần tử chẵn có trong mảng 30. Tính tổng các phần tử lẻ có trong mảng 42

3.8. BÀI TẬP Bài tập 4. 31. Tính tổng các phần tử nguyên tố có trong mảng 32. Tính tổng các phần tử đường chéo chính (ma trận vuông) 33. Tính tổng các phần tử đường chéo phụ (ma trận vuông) 34. Tính tổng các phần tử nằm trên đường biên có trong mảng 35. Tìm phần tử chẵn đầu tiên có trong mảng 36. Tìm phần tử lẻ đầu tiên có trong mảng 37. Tìm phần tử nguyên tố đầu tiên có trong mảng 38. Tìm phần tử chẵn cuối cùng có trong mảng 39. Tìm phần tử chính phương cuối cùng có trong mảng 40. Tìm phần tử lớn nhất có trong mảng 43

3.8. BÀI TẬP Bài tập 5. 41. Đếm số phần tử chẵn có trong mảng 42. Đếm số phần tử lớn nhất có trong mảng 43. In ra vị trí của phần tử lớn nhất đầu tiên có trong mảng 44. Tính tổng các phần tử nằm trên một dòng 45. Tìm dòng có tổng lớn nhất 46. Sắp xếp mảng tăng dần 44

3.8. BÀI TẬP Bài tập 6. 47. Nhập chuỗi 48. Xuất chuỗi 49. Đếm số ký tự a có trong chuỗi 50. Cắt khoảng trắng có trong chuỗi 51. Đếm khoảng trắng trong chuỗi 52. Đếm số từ có trong chuỗi 53. Sắp xếp chuỗi tăng dần 54. Nhập 3 chuỗi, xuất chuỗi theo thứ tự từ điển 45

3.8. BÀI TẬP Bài tập 7. 55. Viết hàm Nhập vào một phân số 56. Viết hàm Nhập vào một dãy phân số 57. Viết hàm xuất một phân số 58. Viết hàm xuất một dãy phân số 59. Viết hàm tìm phân số lớn nhất trong dãy phân số 60. Viết hàm tính tổng các phân số có trong dãy 46

3.8. BÀI TẬP Bài tập 8. 61. Viết hàm nhập một sinh viên. Thông tin: Họ, Tên, mã số SV, ngày tháng năm sinh, giới tính, lớp, điểm toán, điểm lý, điểm tin. 62. Viết hàm xuất dữ liệu một sinh viên với thông tin vừa nhập ở trên 63. Viết hàm nhập danh sách sinh viên, lưu trên mảng một chiều 64. Viết hàm xuất danh sách sinh viên 65. Xuất thông tin của sinh viên có mã sinh viên là X 66. Xuất danh sách sinh viên thuộc ngành công nghệ thông tin 67. Xuất danh sách sinh viên Nữ thuộc ngành công nghệ thông tin 68. Sắp xếp danh sách sinh viên theo tên 69. Sắp xếp danh sách sinh viên theo MSSV 70. Sắp xếp danh sách sinh viên theo điểm toán 47

KHOA CÔNG NGHỆ THÔNG TIN Bài giảng: KỸ THUẬT LẬP TRÌNH HẾT BÀI 4 CON TRỎ C Ngôn ngữ lập trình số 1 thế giới