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

Bài giảng kỹ thuật lập trình – chương 2 quản lý bộ nhớ

32 7 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 32
Dung lượng 509,86 KB

Nội dung

om c cu u du on g th a n co ng Chương 2: Quản lý nhớ CuuDuongThanCong.com https://fb.com/tailieudientucntt Biến: tên biến, vùng nhớ giá trị biến om • Mỗi biến C có tên giá trị tương ứng Khi biến c khai báo, vùng nhớ máy tính cấp ng phát để lưu giá trị biến Kích thước vùng nhớ phu thuộc du on g int x = 10; th a n co kiểu biến, ví dụ byte cho kiểu int • Khi lệnh thực hiện, trình biên dịch thiết lập để cu u byte vùng nhớ lưu giá trị 10 • Phép toán & trả địa x, nghĩa địa ô nhớ vùng nhớ lưu trữ giá trị x CuuDuongThanCong.com https://fb.com/tailieudientucntt Biến: tên biến, vùng nhớ giá trị biến om • Mỗi biến C có tên giá trị tương ứng Khi biến c khai báo, vùng nhớ máy tính cấp ng phát để lưu giá trị biến Kích thước vùng nhớ phu thuộc du on g int x = 10; th a n co kiểu biến, ví dụ byte cho kiểu int • Khi lệnh thực hiện, trình biên dịch thiết lập để cu u byte vùng nhớ lưu giá trị 10 • Phép tốn & trả địa x, nghĩa địa ô nhớ vùng nhớ lưu trữ giá trị x CuuDuongThanCong.com https://fb.com/tailieudientucntt Biến: tên biến, vùng nhớ giá trị biến Tên biến x tham chiếu đến vị trí vùng nhớ Giá trị lưu vùng nhớ c om 65329 th a n 65325 65324 co Địa vị trí vùng nhớ ng 10 cu u du on g • int x = 10; • x biểu diễn tên biến (e.g an assigned name for a memory location ) • &x biểu diễn địa ô nhớ đầu tiền thuộc vùng nhớ x, tức 65325 • *(&x) or x biểu diễn giá trị lưu vùng nhớ x, tức 10 CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương trình ví dụ cu u du on g th a n co ng c om #include int main() { int x = 10; printf("Value of x is %d\n",x); printf("Address of x in Hex is %p\n",&x); printf("Address of x in decimal is %lu\n",&x); printf("Value at address of x is %d\n",*(&x)); return 0; } Value of x is 10 Address of x in Hex is 0061FF0C Address of x in decimal is 6422284 Value at address of x is 10 CuuDuongThanCong.com https://fb.com/tailieudientucntt Khái niệm trỏ om • Con trỏ biến chứa địa vùng nhớ ng c biến khác n co • Cú pháp chung khai báo biến trỏ du on g th a data_type* ptr_name; • Ký hiệu '*’ thơng báo cho trình biên dịch cu u ptr_name biến trỏ data_type định trỏ trỏ tới địa vùng nhớ biến kiểu data_type CuuDuongThanCong.com https://fb.com/tailieudientucntt Tham chiếu ngược (dereference) biến trỏ om ▪ Chúng ta “tham chiếu ngược" trỏ, nghĩa c lấy giá trị biến mà trỏ trỏ vào th a n co ng cách dùng pháp toán ‘*’, chẳng hạn *ptr cu u du on g ▪ Do đó, *ptr có giá trị 10, 10 giá trị x CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ trỏ om int x = 10; c int *p = &x; th a n co ng Nếu trỏ p giữ địa biến a, ta nói p trỏ tới biến a du on g *p biểu diễn giá trị lưu địa p *p gọi “tham chiếu ngược” trỏ p cu u • Con trỏ dùng để lấy địa biến trỏ vào, đồng thời lấy giá trị biến CuuDuongThanCong.com https://fb.com/tailieudientucntt Con trỏ n co ng c om int x = 10; int *ptr; ptr = &x; Tên biến du on g th a 65329 x 65325 10 65324 ptr 65320 *ptr cu u Tên biến trỏ 65325 CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Biến trỏ int *p; co th a n 10 10 Con trỏ int *p; p khai báo trỏ int p = &a; p giữ giá trị địa a, i.e.65325 *p biểu diễn giá trị lưu p, ie.10 int b = *p; b có giá trị 10 *p = 20; a có giá trị 20 du on g Biến int x = 10; &x biểu diễn địa x x biểu diễn giá trị lưu địa 65325 &x 65324 ng 65329 cu u *p = 10; // this is not correct 10 CuuDuongThanCong.com https://fb.com/tailieudientucntt Con trỏ mảng cu u du on g th a n co ng c om Tuy cần ý a nên khơng thể dùng câu lệnh gán hay tốn tử tăng, giảm a++; • Xét trỏ: int *pa; pa = &a[0]; Khi pa trỏ vào phần tử thứ mảng pa +1 trỏ vào phần tử thứ mảng *(pa+i) nội dung a[i] 18 CuuDuongThanCong.com https://fb.com/tailieudientucntt Con trỏ xâu cu u du on g th a n co ng c om • Ta có char tinhthanh[30] =“Da Lat”; • Tương đương : char *tinhthanh; tinhthanh=“Da lat”; Hoặc: char *tinhthanh =“Da lat”; • Ngồi thao tác xâu tương tự mảng *(tinhthanh+3) = “l” • Chú ý : với xâu thường khơng thể gán trực tiếp dịng thứ 19 CuuDuongThanCong.com https://fb.com/tailieudientucntt Mảng trỏ c om • Con trỏ loại liệu nên ta tạo mảng phần tử trỏ theo dạng thức ng *[số phần tử]; th a n co Ví dụ: char *ds[10]; ▫ ds mảng gồm 10 phần tử, phần tử du on g trỏ kiểu char, dùng để lưu trữ 10 xâu ký tự cu u • Cũng có thẻ khởi tạo trực tiếp giá trị khai báo char * ma[10] = {“mot”,”hai”,”ba” }; 20 CuuDuongThanCong.com https://fb.com/tailieudientucntt Mảng trỏ cu u du on g th a n co ng c om • Một ưu điểm khác mảng trỏ ta hốn chuyển đối tượng (mảng con, cấu trúc ) trỏ trỏ cách hoán đổi trỏ • Ưu điểm việc truyền tham số hàm • Ví dụ: Vào danh sách lớp theo họ tên, sau xếp để in theo thứ tự ABC 21 CuuDuongThanCong.com https://fb.com/tailieudientucntt cu u du on g th a n co ng c om Mảng trỏ 22 CuuDuongThanCong.com https://fb.com/tailieudientucntt Con trỏ trỏ tới trỏ om • Bản thân trỏ biến, có địa dùng trỏ khác để trỏ tới địa .c ** ; cu u du on g th a n co ng • Ví dụ: int x = 12; int *p1 = &x; int **p2 = &p1; • Có thể mơ tả mảng chiều qua trỏ trỏ theo cơng thức : M[i][k] = *(*(M+i)+k) Trong đó: ▫ M+i địa phần tử thứ i mảng ▫ *(M+i) cho nội dung phần tử ▫ *(M+i)+k địa phần tử [i][k] 23 CuuDuongThanCong.com https://fb.com/tailieudientucntt Con trỏ trỏ tới trỏ cu u du on g th a n co ng c om Ví dụ: in ma trận vuông cộng phần tử ma trận với 10 24 CuuDuongThanCong.com https://fb.com/tailieudientucntt Quản lý nhớ - Bộ nhớ động cu u du on g th a n co ng c om • Cho đến lúc ta dùng nhớ tĩnh: tức khai báo mảng, biến đối tượng khác cách tường minh trước thực chương trình • Trong thực tế nhiều ta khơng thể xác định trước kích thước nhớ cần thiết để làm việc, phải trả giá việc khai báo dự trữ lớn • Nhiều đối tượng có kích thước thay đổi linh hoạt 25 CuuDuongThanCong.com https://fb.com/tailieudientucntt Quản lý nhớ - Bộ nhớ động cu u du on g th a n co ng c om • Việc dùng nhớ động cho phép xác định nhớ cần thiết trình thực chương trình, đồng thời giải phóng chúng khơng cịn cần đến để dùng nhớ cho việc khác • Trong C ta dùng hàm malloc, calloc, realloc free để xin cấp phát, tái cấp phát giải phóng nhớ • Trong C++ ta dùng new delete 26 CuuDuongThanCong.com https://fb.com/tailieudientucntt Cấp phát nhớ động ng c om • Cú pháp xin cấp phát nhớ: = new ; co = new [số phần tử]; cu u du on g th a n dòng xin cấp phát vùng nhớ cho biến đơn, dòng cho mảng phần tử có kiểu với kiểu liệu • Giải phóng nhớ delete ptr; // xóa biến đơn delete [] ptr; // xóa biến mảng 27 CuuDuongThanCong.com https://fb.com/tailieudientucntt Cấp phát nhớ động cu u du on g th a n co ng c om • Bộ nhớ động quản lý hệ điều hành, chia sẻ hàng loạt ứng dụng, khơng đủ nhớ Khi tốn tử new trả trỏ NULL • Ví dụ: int *ptr; ptr = new int [200]; if (ptr == NULL) { // thông báo lỗi xử lý } 28 CuuDuongThanCong.com https://fb.com/tailieudientucntt cu u du on g th a n co ng c om Ví dụ 29 CuuDuongThanCong.com https://fb.com/tailieudientucntt Bộ nhớ động cho mảng chiều cu u du on g th a n co ng c om • Cách 1: Biểu diễn mảng chiều thành mảng chiều • Gọi X mảng hai chiều có kích thước m dịng n cột A mảng chiều tương ứng, X[i][j] = A[i*n+j] 30 CuuDuongThanCong.com https://fb.com/tailieudientucntt Bộ nhớ động cho mảng chiều cu u du on g th a n co ng c om • Cách 2: Dùng trỏ trỏ • Ví dụ: Với mảng số ngun chiều có kích thước R * C ta khai báo sau: int **mt; mt = new int *[R]; int *temp = new int[R*C]; for (i=0; i< R; ++i) { mt[i] = temp; temp += C; } • Để giải phóng: delete [] mt[0]; delete [] mt; 31 CuuDuongThanCong.com https://fb.com/tailieudientucntt Bộ nhớ động cho mảng chiều cu u du on g th a n co ng c om • Ví dụ khác để cấp phát động cho mảng hai chiều chứa số thực float 32 CuuDuongThanCong.com https://fb.com/tailieudientucntt ... %d ",*ptr); CuuDuongThanCong.com Value of x is 10 Address of x is 6 422 284 Value of pointer ptr is 6 422 284 Address of pointer ptr is 6 422 280 Ptr pointing value is 10 https://fb.com/tailieudientucntt... https://fb.com/tailieudientucntt Quản lý nhớ - Bộ nhớ động cu u du on g th a n co ng c om • Cho đến lúc ta dùng nhớ tĩnh: tức khai báo mảng, biến đối tượng khác cách tường minh trước thực chương trình • Trong thực... https://fb.com/tailieudientucntt Biến: tên biến, vùng nhớ giá trị biến Tên biến x tham chiếu đến vị trí vùng nhớ Giá trị lưu vùng nhớ c om 65 329 th a n 65 325 65 324 co Địa vị trí vùng nhớ ng 10 cu u du on g • int x

Ngày đăng: 28/12/2021, 19:12