Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 32 trang
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