Bài giảng Kỹ thuật lập trình – Chương 2: Quản lý bộ nhớ
lượt xem 6
download
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.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Kỹ thuật lập trình – Chương 2: Quản lý bộ nhớ
- om .c Chương 2: ng co Quản lý bộ nhớ an th o ng du u cu CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Biến: tên biến, vùng nhớ và giá trị biến • Mỗi biến trong C có tên và giá trị tương ứng. Khi một biến om được khai báo, một vùng nhớ trong máy tính sẽ được cấp .c phát để lưu giá trị của biến. Kích thước vùng nhớ phu thuộc ng kiểu của biến, ví dụ 4 byte cho kiểu int co an int x = 10; th ng • Khi lệnh này được thực hiện, trình biên dịch sẽ thiết lập để o du 4 byte vùng nhớ này lưu giá trị 10. u cu • Phép toán & trả về địa chỉ của x, nghĩa là địa chỉ của ô nhớ đầu tiên trong vùng nhớ lưu trữ giá trị của x. 2 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Biến: tên biến, vùng nhớ và giá trị biến • Mỗi biến trong C có tên và giá trị tương ứng. Khi một biến om được khai báo, một vùng nhớ trong máy tính sẽ được cấp .c phát để lưu giá trị của biến. Kích thước vùng nhớ phu thuộc ng kiểu của biến, ví dụ 4 byte cho kiểu int co an int x = 10; th ng • Khi lệnh này được thực hiện, trình biên dịch sẽ thiết lập để o du 4 byte vùng nhớ này lưu giá trị 10. u cu • Phép toán & trả về địa chỉ của x, nghĩa là địa chỉ của ô nhớ đầu tiên trong vùng nhớ lưu trữ giá trị của x. 3 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Biến: tên biến, vùng nhớ và giá trị biến Tên biến x tham chiếu đến vị trí vùng 65329 Giá trị được lưu trong om nhớ vùng nhớ .c 10 Địa chỉ của vị trí vùng nhớ ng 65325 co 65324 an • int x = 10; • x biểu diễn tên biến th ng (e.g. an assigned name for a memory location ) o du • &x biểu diễn địa chỉ ô nhớ đầu tiền thuộc vùng nhớ của x, tức là 65325 u cu • *(&x) or x biểu diễn giá trị được lưu trong vùng nhớ của x, tức là 10 4 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Chương trình ví dụ #include int main() { om int x = 10; .c printf("Value of x is %d\n",x); ng printf("Address of x in Hex is %p\n",&x); co printf("Address of x in decimal is an %lu\n",&x); th printf("Value at address of x is ng %d\n",*(&x)); o return 0; du } u cu 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 5 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Khái niệm con trỏ • Con trỏ là một biến chứa địa chỉ vùng nhớ của một om biến khác. .c ng • Cú pháp chung khai báo biến con trỏ co an data_type* ptr_name; th o ng • Ký hiệu '*’ thông báo cho trình biên dịch rằng du ptr_name là một biến con trỏ và data_type chỉ định u cu rằng con trỏ này sẽ trỏ tới địa chỉ vùng nhớ của một biến kiểu data_type. 6 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Tham chiếu ngược (dereference) biến con trỏ ▪ Chúng ta có thể “tham chiếu ngược" một con trỏ, nghĩa om là lấy giá trị của biến mà con trỏ đang trỏ vào bằng .c cách dùng pháp toán ‘*’, chẳng hạn *ptr. ng co an ▪ Do đó, *ptr có giá trị 10, vì 10 đang là giá trị của x. th o ng du u cu 7 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Ví dụ con trỏ int x = 10; om int *p = &x; .c Nếu con trỏ p giữ địa chỉ của biến a, ta nói p trỏ tới biến ng a co an *p biểu diễn giá trị lưu tại địa chỉ p th ng *p được gọi là “tham chiếu ngược” của con trỏ p o du u • Con trỏ được dùng để lấy địa chỉ của biến nó trỏ vào, cu đồng thời cũng có thể lấy giá trị của biến đó 8 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Con trỏ int x = 10; int *ptr; om ptr = &x; .c ng co 65329 an th 10 65325 ng Tên biến x 65324 o du 65325 *ptr Tên biến con trỏ ptr 65320 u cu 9 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Biến và con trỏ om .c 65329 Biến Con trỏ ng int x = 10; 10 int *p; p được khai báo là con trỏ int &x biểu diễn địa chỉ của x p = &a; p giữ giá trị địa chỉ a, i.e.65325 co 10 x biểu diễn giá trị lưu tại địa *p biểu diễn giá trị lưu tại p, ie.10 an chỉ &x 65325 int b = *p; b có giá trị 10. 65324 th ng *p = 20; a có giá trị 20. int *p; o du *p = 10; // this is not correct. u cu 10 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Ví dụ con trỏ #include int main() { om int x = 10; .c int *ptr; ng ptr = &x; co printf("Value of x is %d\n", x); printf("Address of x is %lu\n", (unsigned long int) &x); an printf("Value of pointer ptr is %lu\n", (unsigned long int) th ptr); ng printf("Address of pointer ptr is %lu\n", (unsigned long int) &ptr); o du printf("Ptr pointing value is %d\n",*ptr); u return 0; Value of x is 10 cu } Address of x is 6422284 Value of pointer ptr is 6422284 Address of pointer ptr is 6422280 11 CuuDuongThanCong.com Ptr pointing value is 10 https://fb.com/tailieudientucntt
- Các phép toán trên con trỏ • Cộng hoặc trừ với 1 số nguyên n trả về 1 con trỏ om cùng kiểu, là địa chỉ mới trỏ tới 1 đối tượng khác nằm cách đối tượng đang bị trỏ n phần tử .c ng • Trừ 2 con trỏ cho ta khoảng cách (số phần tử) co giữa 2 con trỏ an • KHÔNG có phép cộng, nhân, chia 2 con trỏ th • Có thể dùng các phép gán, so sánh các con trỏ o ng ▫ Chú ý đến sự tương thích về kiểu. du u cu 12 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Ví dụ char *pchar; short *pshort; long *plong; om pchar ++; pshort ++; plong ++; .c ng Giả sử các địa chỉ ban đầu tương ứng của 3 con co trỏ là 100, 200 và 300, kết quả ta có các giá trị an 101, 202 và 304 tương ứng th o ng Nếu viết tiếp du plong += 5; => plong = 324 u cu pchar -=10; => pchar = 91 pshort +=5; => pshort = 212 13 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Chú ý ++ và -- có độ ưu tiên cao hơn * nên *p++ om tương đương với *(p++) tức là tăng địa chỉ mà nó trỏ tới chứ không phải tăng giá trị mà nó chứa. .c ng co *p++ = *q++ sẽ tương đương với an *p = *q; th ng p=p+1; o du q=q+1; u cu 14 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Con trỏ *void • Là con trỏ không định kiểu. Nó có thể trỏ tới bất kì một loại biến nào. om .c • Thực chất một con trỏ void chỉ chứa ng một địa chỉ bộ nhớ mà không biết rằng co tại địa chỉ đó có đối tượng kiểu dữ liệu gì. an Do đó không thể truy cập nội dung của th một đối tượng thông qua con trỏ void. o ng • Để truy cập được đối tượng thì trước hết du phải ép kiểu biến trỏ void thành biến trỏ u cu có định kiểu của kiểu đối tượng 15 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Con trỏ *void float x; int y; void *p; // khai báo con trỏ void om p = &x; // p chứa địa chỉ số thực x .c ng *p = 2.5; // báo lỗi vì p là con trỏ void co /* cần phải ép kiểu con trỏ void trước khi truy cập đối tượng qua con trỏ */ an th *((float*)p) = 2.5; // x = 2.5 ng p = &y; // p chứa địa chỉ số nguyên y o *((int*)p) = 2; // y = 2 du u cu 16 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Con trỏ và mảng • Giả sử ta có int a[30]; thì &a[0] là địa chỉ phần tử đầu tiên của mảng đó, om đồng thời là địa chỉ của mảng. .c ng • Trong C, tên của mảng chính là một hằng co địa chỉ bằng địa chỉ của phần tử đầu tiên an của mảng th ng a = &a[0]; o du a+i = &a[i]; u cu 17 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Con trỏ và mảng Tuy vậy cần chú ý rằng a là 1 hằng nên không thể dùng nó trong câu lệnh gán hay om toán tử tăng, giảm như a++; .c ng • Xét con trỏ: int *pa; co pa = &a[0]; an th Khi đó pa trỏ vào phần tử thứ nhất của ng mảng và o du pa +1 sẽ trỏ vào phần tử thứ 2 của mảng u cu *(pa+i) sẽ là nội dung của a[i] 18 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Con trỏ và xâu • Ta có char tinhthanh[30] =“Da Lat”; om • Tương đương : .c char *tinhthanh; ng tinhthanh=“Da lat”; co Hoặc: char *tinhthanh =“Da lat”; an th • Ngoài ra các thao tác trên xâu cũng tương tự ng như trên mảng o du *(tinhthanh+3) = “l” u • Chú ý : với xâu thường thì không thể gán trực cu tiếp như dòng thứ 3 19 CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Mảng các con trỏ • Con trỏ cũng là một loại dữ liệu nên ta có thể tạo một mảng các phần tử là con trỏ theo dạng om thức. .c *[số phần tử]; ng Ví dụ: char *ds[10]; co an ▫ ds là 1 mảng gồm 10 phần tử, mỗi phần tử là th 1 con trỏ kiểu char, được dùng để lưu trữ được ng của 10 xâu ký tự nào đó o • Cũng có thẻ khởi tạo trực tiếp các giá trị khi du khai báo u cu char * ma[10] = {“mot”,”hai”,”ba”...}; 20 CuuDuongThanCong.com https://fb.com/tailieudientucntt
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Kỹ thuật lập trình - Phạm Thế Bảo
0 p | 220 | 32
-
Bài giảng Kỹ thuật lập trình: Chương I - Lưu Hồng Việt
48 p | 194 | 23
-
Bài giảng Kỹ thuật lập trình: Chương IV - Lưu Hồng Việt
32 p | 151 | 17
-
Bài giảng Kỹ thuật lập trình: Chương III - Lưu Hồng Việt
51 p | 148 | 15
-
Bài giảng Kỹ thuật lập trình: Chương V - Lưu Hồng Việt
19 p | 127 | 15
-
Bài giảng Kỹ thuật lập trình: Phần 1 - ĐH CNTT&TT
37 p | 114 | 10
-
Bài giảng Kỹ thuật lập trình - Bài 1: Tổng quan về kỹ thuật lập trình
65 p | 165 | 8
-
Bài giảng Kỹ thuật lập trình: Bài 1 - Phạm Đình Sắc
9 p | 129 | 7
-
Bài giảng Kỹ thuật lập trình nâng cao: Chương 4 - ThS. Dương Thành Phết
26 p | 92 | 7
-
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 p | 15 | 4
-
Bài giảng Kỹ thuật lập trình: Chương 1 - Trần Quang
39 p | 8 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 2 - Trần Quang
25 p | 10 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 3 - Trần Quang
52 p | 10 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 4 - Trần Quang
32 p | 7 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 6 - Trần Quang
37 p | 11 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 7 - Trần Quang
28 p | 6 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 8 - Trần Quang
34 p | 8 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 9 - Trần Quang
33 p | 4 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn