1. Trang chủ
  2. » Giáo án - Bài giảng

Lec2 quan ly bo nho ban moi 1203

44 1 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

Tiêu đề Quản Lý Bộ Nhớ
Định dạng
Số trang 44
Dung lượng 1,35 MB

Nội dung

Chương 2: Quản lý nhớ Biến: tên biến, vùng nhớ giá trị biến • 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 phát để lưu giá trị biến Kích thước vùng nhớ phu thuộc kiểu biến, ví dụ byte cho kiểu int  int x = 10; • Khi lệnh thực hiện, trình biên dịch thiết lập để 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 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 Giá trị lưu vùng nhớ 10 Địa vị trí vùng nhớ 65325 65324 • • • • int x = 10; x biểu diễn tên biến &x biểu diễn địa ô nhớ đầu tiền thuộc vùng nhớ x, tức 65325 *(&x) x biểu diễn giá trị lưu vùng nhớ x, tức 10 Chương trình ví dụ #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 Khái niệm trỏ • Con trỏ biến chứa địa vùng nhớ biến khác • Cú pháp chung khai báo biến trỏ data_type* ptr_name; • Ký hiệu '*’ thơng báo cho trình biên dịch ptr_name biến trỏ data_type định trỏ trỏ tới địa vùng nhớ biến kiểu data_type Tham chiếu ngược (dereference) biến trỏ  Chúng ta “tham chiếu ngược" trỏ, nghĩa lấy giá trị biến mà trỏ trỏ vào cách dùng pháp toán ‘*’, chẳng hạn *ptr  Do đó, *ptr có giá trị 10, 10 giá trị x Ví dụ trỏ int x = 10; int *p = &x; Nếu trỏ p giữ địa biến a, ta nói p trỏ tới biến a *p biểu diễn giá trị lưu địa p *p gọi “tham chiếu ngược” trỏ p • Con trỏ dùng để lấy địa biến trỏ vào, đồng thời lấy giá trị biến • int a,b,c; => a,b,c int • int * p,q,r; => p trỏ int, cịn q,r biến int • Để p,q va r trỏ int :int *p, *q, * r; Con trỏ int x = 10;        int *ptr; ptr = &x; 65329 Tên biến 65325 x 10 65324 65325 Tên biến trỏ ptr *ptr 65320 Biến trỏ 65329 Con trỏ Biến int x = 10; 10 int *p; p khai báo trỏ int &x biểu diễn địa x 10 p = &a; p giữ giá trị địa a, i.e.65325 *p biểu diễn giá trị lưu p, ie.10 x biểu diễn giá trị lưu địa &x 65325 65324 int b = *p; b có giá trị 10 *p = 20; a có giá trị 20 int *p; *p = 10; // this is not correct 10 Con trỏ trỏ tới trỏ Ví dụ: in ma trận vuông cộng phần tử ma trận với 10 #include #define rows #define cols int main() { int arr[rows][cols] = {{7,8,9}, {10,13,15}, {2,7,8}}; for (int i = 0; i < rows; i++) { for (int j=0; j < cols; j++) printf("%d\t", arr[i][j]); printf("\n"); } for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { *(*(arr + i) + j) = *(*(arr + i) + j) + 10; printf("%d\t", *(*(arr + i) + j)); } printf("\n"); } } 30 Quản lý nhớ - Bộ nhớ động • 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 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ữ q lớn • Nhiều đối tượng có kích thước thay đổi linh hoạt 31 Quản lý nhớ - Bộ nhớ động • 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 32 Cấp phát nhớ động • Cú pháp xin cấp phát nhớ: = new ; = new [số phần tử]; 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 33 Cấp phát nhớ động • 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ý } 34 Ví dụ #include #include int main() { int n; long total=100, x, *arr; printf("Nhap n = "); scanf("%d",&n); arr = new long [n]; if (arr==NULL) { printf("Cap phat khong cong\n"); exit(1); } for (int i=0; i < n; i++){ printf("\n Vao so thu %d: ", i+1 ); scanf("%d", &arr[i] ); } printf("Danh sach cac so: \n"); for (int i=0; i < n; i++) printf("%d ", arr[i]); delete [] arr; return 0; } 35 Bộ nhớ động cho mảng chiều • 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] 36 Bộ nhớ động cho mảng chiều • • Cách 2: Dùng trỏ trỏ - Cách cài đặt C 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; } Dung mt[i][j] nhu mang chieu bt • Để giải phóng: delete [] mt[0]; delete [] mt; 37 Bộ nhớ động cho mảng chiều • Ví dụ khác để cấp phát động cho mảng hai chiều chứa số thực float trận cưa ? - Ma // Khởi tạo ma trận với R hàng C cột float ** M = new float *[R]; for (i=0; i < R; i++) M[i] = new float[C]; // Dùng M[i][j] cho phần tử ma trận   // Giải phóng for(i=0; i

Ngày đăng: 14/10/2022, 00:45

HÌNH ẢNH LIÊN QUAN

Sơ đồ bộ nhớ - Lec2  quan ly bo nho   ban moi 1203
Sơ đồ b ộ nhớ (Trang 39)

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

TÀI LIỆU LIÊN QUAN

w