Biến được lưu ở đâu

Bài 4: SỬ DỤNG BIẾN TRONG CHƯƠNG TRÌNH

1. Biến là công cụ trong lập trình

- Để chương trình luôn biết chính xác dữ liệu cần xử lí ở vị trí nào trong quá trình hoạt động, các ngôn ngữ lập trình cung cấp một công cụ rất quan trọng cho người viết chương trình. Đó là biến nhớ, hay được gọi ngắn gọn là biến.

- Trong lập trình biến được dùng để lưu trữ dữ liệu và dữ liệu được biến lưu trữ có thể thay đổi trong khi thực hiện chương trình.

- Dữ liệu do biến lưu trữ được gọi là giá trị của biến.

Ví dụ: Xét câu lệnh: Writeln [15+5];  => lệnh này sẽ in ra màn hình số 20 và đưa con trỏ xuống đầu dòng tiếp theo.

=> Chúng ta có thể viết lại câu lệnh trên như sau: Ta có thể sử dụng hai biến X và Y để lưu giữ giá trị của hai số 15 và 5. Khi đó: Câu lệnh sẽ là: Writeln [x+y]; 

2. Khai báo biến

a. Khai báo biến

-  Khai báo biến gồm:

  • Khai báo tên biến. Tên biến phải tuân theo quy tắc đặt tên của ngôn ngữ lập trình.
  • Khai báo kiểu dữ liệu biến;

- Cú pháp: Var : ;

- Tùy theo ngôn ngữ lập trình, cú pháp khai báo biến có thể khác nhau.

- Ví dụ Khai báo biến trong Pascal:
Var  m, n: integer;

           s, dientich: real;

           thong_bao, ten: string;

Trong đó:

  • var là từ khóa dùng để khai báo,
  • m, n là các biến có kiểu nguyên [integer],
  • S, dientich là các biến có kiểu thực [real],
  • thong_bao, ten là biến kiểu xâu [string].

3. Sử dụng biến trong chương trình

- Các thao tác được thực hiện trên các biến là:

  • Gán giá trị cho biến và
  • Tính toán với các biến.

- Câu lệnh gán trong NNLT thường có dạng: Tên biến \[{}\]\[\leftarrow\] Biểu thức cần gán giá trị cho biến. Trong đó, \[\leftarrow\] biểu thị phép gán.

- Ví dụ:

  • x \[\leftarrow\] -c/b;
  • x \[\leftarrow\] y;
  • i \[\leftarrow\] i + 5;

- Trong ngôn ngữ lập trình Pascal, người ta kí hiệu phép gán là dấu kép := để phân biệt với dấu [=] phép so sánh.

Ví dụ:

 Lệnh trong Pascal 

Ý nghĩa

x := 12;

 Gán giá trị số12 vào biến x.

x := y;

 Gán giá trị đã lưu trong biến y vào biến x.

x := [a+b]/2;

 Thực hiện tính trung bình cộng 2 giá trị được lưu trong 2 biến a, b rồi gán lại giá trị cho biến x. 

x := x+1;

 Tăng x lên 1 đơn vị rồi gán lại giá trị cho biến x.

Lưu ý: Kiểu dữ liệu của giá trị được gán phải tùng với kiểu của biến và khi được gán giá trị mới thì giá trị cũ của biến sẽ bị xóa.

4. Hằng

- Hằng cũng dùng để lưu trữ dữ liệu

- Khác với biến, hằng là đại lượng có giá trị không đổi trong suốt quá trình thực hiện chương trình.

- Cú pháp khai báo hằng: Const =;

- Ví dụ: Const pi = 3.14; 

* Lưu ý:

- Không thể dùng câu lệnh để thay đổi giá trị của hằng ở bất kì vị trí nào trong chương trình 

- Khi cần thay đổi giá trị của hằng ta chỉ cần thay đổi giá trị tại nơi khai báo.

Ở 1 bài khác đã nói, học C++ khá là khó. Một trong các vấn đề khó hiểu nhất của C/C++ chính là con trỏ. Bài viết hôm nay diễn giải sâu hơn, chi tiết hơn về con trỏ cho mọi người

Các ngôn ngữ khác ko phải ko có con trỏ, vấn đề là nó đc ngôn ngữ ẩn giấu đi, ko cho người dùng thao tác trực tiếp và can thiệp trực tiếp vào bộ nhớ. Việc này đôi khi giúp người dùng quên đi các nỗi lo như quên ko giải phóng bộ nhớ, kiểm tra bộ nhớ có đc cấp phát hay không, nhưng đôi khi làm tốc độ xử lí của chương trình chậm. 

Nói chung, con trỏ khó, nhưng cũng là 1 điểm mạnh của C++. Biết và hiểu sâu về nó, bạn sẽ làm đc rất nhiều bài toán tối ưu

Bài viết này giải thích 1 số khái niệm, kiến thức để học tốt hơn C++. Nhưng mình nghĩ nó cũng rất là hữu ích cho những bạn muốn hiểu sâu hơn về bộ nhớ, cách quản lý bộ nhớ của các ngôn ngữ khác

Trước khi tìm hiểu bộ nhớ, hãy tìm hiểu kiến thức về bộ nhớ nói chung

Ai cũng biết đơn vị nhỏ nhất để biểu diễn kích thước bộ nhớ là byte [bỏ qua bit]. Chúng ta tưởng tượng mỗi 1 byte là 1 ô nhớ. Như vậy, với máy tính có 4GB ram chúng ta có 2^32 ~ 4 tỷ cái ô nhớ [mỗi ô 1 byte] như vậy xếp liền nhau

Để các bộ phận khác của máy tính [như CPU] có thể truy xuất vào bộ nhớ, tất nhiên chúng ta cần đánh địa chỉ cho các ô nhớ. Tưởng tượng, 4 tỷ ô nhớ nói trên đc đánh số từ 0 đến 3 999 999 999 [như kiểu đánh số nhà ấy]

Thỉnh thoảng, các bạn nhìn thấy các xâu ký tự kiểu như 0x008888ff, 0x001002fe ... thì đây chính là địa chỉ của các ô nhớ đc biểu diễn dưới cơ số 16 [hexa]. Khi biết đc địa chỉ các ô nhớ này, các phần cứng máy tính khác, hay chương trình phần mềm của bạn có thể truy xuất và lấy ra đc dữ liệu đang lưu trong ô nhớ. Đó chính là nguyên tắc lưu trữ và truy xuất biến, mà tí nữa mình sẽ giải thích sâu hơn

     

Vậy bạn có biết rằng, windows 32 bít hồi xưa chỉ nhận đc tối đa 4GB ram hay chưa? [kể cả cắm 8GB ram vào thì vẫn chỉ dùng đc 4GB ram]. Đó chính là vì win 32 bit đánh số địa chỉ bộ nhớ từ 0 đến 2^32, mà 2^32 ~ 4 tỷ nên ko thể đánh địa chỉ cho các ô nhớ có giá trị cao hơn 4 tỷ đc nữa

Đối vs win 64 bit, bộ nhớ đc đánh địa chỉ từ 0 -> 2^64 đủ để biểu diễn và sử dụng bộ nhớ lớn hơn rất nhiều 

3. Biến và địa chỉ của biến:

Trong bất cứ ngôn ngữ nào, khi học và biến bạn đều biết biến gồm tên và kiểu [có 1 số ngôn ngữ ko cần khai báo kiểu của biến, nhưng thực ra đó là do trình biên dịch tự hiểu biến theo 1 kiểu gì đó]

Giống như int a, float f thì a và f là tên, int và float là kiểu

Bình thường chúng ta dùng tên để truy cập và thao tác vs biến, đúng ko? Nhưng thực ra máy tính ko dùng tên đâu, nó sẽ dùng địa chỉ

Khi bạn khai báo 1 biến a kiểu int 4 bytes, máy tính sẽ tự động cấp phát 1 vùng nhớ 4 bytes [vùng nhớ đang rảnh và ko bị sử dụng bởi chương trình khác] và lưu lại cái địa chỉ của biến này ví dụ là 0x0000fffe. Khi đó, mỗi lần bạn gọi tới biến a, thì hệ thống sẽ dùng cái địa chỉ 0x0000fffe vừa lưu ở bước trên để tính toán

Máy tính sẽ có 1 bảng để đối chiếu, ánh xạ giữa tên biến và địa chỉ. Kiểu như thế này này:

Tên biến Địa chỉ
name 0x0000ffef
age 0x0f001ffff
x 0x01020304
i 0x040203ff

Khi đó, khi bạn truy cập vào biến thông qua tên, máy tính sẽ hiểu và lấy đc biến ở đúng địa chỉ đó. 

Với C/C++, bạn có thể biết đc địa chỉ của 1 biến đc cấp phát trong bộ nhớ thông qua toán tử &. Mã code như thế này, hãy chạy thử và xem thử kết quả nhé

#include using namespace std; int main[] { int a; float b; cout

Chủ Đề