Bài giảng Kỹ thuật lập trình – Chương 2: Quản lý bộ nhớ

32 15 0
Bài giảng Kỹ thuật lập trình – Chương 2: Quản lý bộ nhớ

Đ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

Bài giảng Kỹ thuật lập trình – Chương 2: Quản lý bộ nhớ trang bị cho người học những kiến thức cơ bản về: Biến: tên biến, vùng nhớ và giá trị biến; biến và con trỏ; các phép toán trên con trỏ; con trỏ và mảng;... Mời các bạn cùng tham khảo để biết thêm nội dung chi tiết.

.c om cu u du o ng th an 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 c om • Mỗi biến C có tên giá trị tương ứng Khi biến 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 an co kiểu biến, ví dụ byte cho kiểu int ng th int x = 10; du o • 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 c om • Mỗi biến C có tên giá trị tương ứng Khi biến 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 an co kiểu biến, ví dụ byte cho kiểu int ng th int x = 10; du o • 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ớ 65329 c om Giá trị lưu vùng nhớ an 65325 65324 co Địa vị trí vùng nhớ ng 10 cu u du o ng th • 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 o ng th an 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ỏ c om • Con trỏ biến chứa địa vùng nhớ ng biến khác an co • Cú pháp chung khai báo biến trỏ du o ng th 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ỏ c om ▪ Chúng ta “tham chiếu ngược" trỏ, nghĩa lấy giá trị biến mà trỏ trỏ vào an co ng cách dùng pháp toán ‘*’, chẳng hạn *ptr cu u du o ng th ▪ Do đó, *ptr có giá trị 10, 10 giá trị x CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ trỏ c om int x = 10; int *p = &x; an co ng Nếu trỏ p giữ địa biến a, ta nói p trỏ tới biến a ng th *p biểu diễn giá trị lưu địa p u du o *p gọi “tham chiếu ngược” trỏ p cu • 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ỏ co ng c om int x = 10; int *ptr; ptr = &x; ng th an 65329 x du o Tên biến 10 65324 ptr 65320 65325 *ptr cu u Tên biến trỏ 65325 CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Biến trỏ co an th du o int *p; 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 ng 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 o ng th an 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 o ng th an 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 an co Ví dụ: char *ds[10]; ▫ ds mảng gồm 10 phần tử, phần tử du o ng 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 o ng th an 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 hố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 o ng th an co ng c om Mảng trỏ 22 CuuDuongThanCong.com https://fb.com/tailieudientucntt Con trỏ trỏ tới trỏ c om • Bản thân trỏ biến, có địa dùng trỏ khác để trỏ tới địa ** ; cu u du o ng th an 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 o ng th an co ng c om Ví dụ: in ma trận vng 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 o ng th an 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 o ng th an 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 đế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 o ng th an 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 o ng th an 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 o ng th an co ng c om Ví dụ 29 CuuDuongThanCong.com https://fb.com/tailieudientucntt Bộ nhớ động cho mảng chiều cu u du o ng th an 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 o ng th an 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 o ng th an 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 ... https://fb.com/tailieudientucntt Quản lý nhớ - Bộ nhớ động cu u du o ng th an 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... 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ớ. .. du o ng th an 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

Ngày đăng: 19/06/2021, 07:14

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan