Hỏi/ Thắc mắc - Con trỏ C/C++ về vùng nhớ? | VN-Zoom | Cộng đồng Chia Sẻ Kiến Thức Công Nghệ và Phần Mềm Máy Tính

Adblocker detected! Please consider reading this notice.

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

We need money to operate the site, and almost all of it comes from our online advertising.

If possible, please support us by clicking on the advertisements.

Please add vn-z.vn to your ad blocking whitelist or disable your adblocking software.

×

Hỏi/ Thắc mắc Con trỏ C/C++ về vùng nhớ?

boyfriend

Búa Gỗ Đôi
Xin chào mọi người.
Tôi có học về con trỏ trong C/C++. Nhưng theo tôi biết biến con trỏ chia ra làm 3 phần:
+ Địa chỉ con trỏ.
+ Vùng nhớ con trỏ. ( Để lưu giá trị của con trỏ )
+ Miền nhớ con trỏ. ( để lưu địa chỉ đến biến mà con trỏ trỏ tới )

Khi ta khai báo biến con trỏ
Mã:
int a;

int *b;
Thì tự khắc con trỏ đã có Địa chỉ con trỏMiền nhớ con trỏ. Tức là khi ta trỏ đến biến a thì Miền nhớ con trỏ sẽ lưu địa chỉ của biến a. Tuy nhiên, lúc này thì vùng nhớ của con trỏ vẫn chưa được thiết lập.

Sau đó, giả sử chúng ta thiết lập một vùng nhớ:

int *b = new int;

Thì lúc này, HĐH sẽ cấp một vùng nhớ ngẫu nhiên cho con trỏ để con trỏ trỏ đến vùng nhớ đó. Vậy đã có vùng nhớ.

Sau tất cả, tôi muốn hỏi là:
Trước khi ta thiết lập một vùng nhớ, khi ta khai báo con trỏ, thì nó có sẵn ô nhớ nào để lưu địa chỉ của biến mà nó trỏ đến chưa ? Nếu có ô nhớ như thế, thì khi ta không cần trỏ, ta cần cấp cho 1 vùng nhớ tại sao nó không tự lấy vùng nhớ lưu địa chỉ để làm vùng nhớ lưu giá trị như thế thì thật lãng phí vùng nhớ dùng để lưu địa chỉ kia.
 
Sửa lần cuối:

NgoHungCuong


Junior Moderator
Thành viên BQT
Mình nghĩ bạn có thể chưa hiểu đúng về con trỏ thì phải.
Trước hết con trỏ là 1 biến cái đã. Khi khai báo thì nó đã được cấp phát bộ nhớ. Dung lượng của biến con trỏ chiếm tùy thuộc vào hệ điều hành. Với ứng dụng 32 bit thì biến con trỏ chiếm 4 byte, với ứng dụng 64 bit thì biến này chiếm 8 byte. Bất chấp con trỏ kiểu gì. Còn biến con trỏ khác với các loại biến khác ở chỗ biến con trỏ dùng để chứa địa chỉ (mà thực ra địa chỉ này cũng là 1 số nguyên mà thôi).
 

boyfriend

Búa Gỗ Đôi
Mình nghĩ bạn có thể chưa hiểu đúng về con trỏ thì phải.
Trước hết con trỏ là 1 biến cái đã. Khi khai báo thì nó đã được cấp phát bộ nhớ. Dung lượng của biến con trỏ chiếm tùy thuộc vào hệ điều hành. Với ứng dụng 32 bit thì biến con trỏ chiếm 4 byte, với ứng dụng 64 bit thì biến này chiếm 8 byte. Bất chấp con trỏ kiểu gì. Còn biến con trỏ khác với các loại biến khác ở chỗ biến con trỏ dùng để chứa địa chỉ (mà thực ra địa chỉ này cũng là 1 số nguyên mà thôi).

Cám ơn bạn. Mình hiểu ra vấn đề rồi. Cám ơn bạn nhiều. @NgoHungCuong
 

nhoxboy2010

Rìu Sắt Đôi
Giá trị của con trỏ là gì vậy bạn?
Theo mình biết thì khi khai báo một pointer thì nó sẽ lưu lại địa chỉ của biến mà nó trỏ tới. Tức là chỉ có địa chỉ con trỏ, và miền nhớ con trỏ.
 

kemmet

Rìu Sắt Đôi
bạn hiểu đơn giản về con trỏ thế này.
Biến con trỏ cũng giống như các biến khác.
Biến gồm 2 thành phần: Địa chỉ và giá trị(theo đúng kiểu của nó).
Biến int thì có địa chỉ và có giá trị theo kiểu int ( Biểu diễn các số nguyên)
Biến float thì có địa chỉ và có giá trị theo kiểu float ( Biểu diễn các số thực)

Biến con trỏ thì nó cũng có địa chỉ, và nó có giá trị theo kiểu point ( Biểu diễn các ô địa chỉ)
Điểm khác biệt giữa biến con trỏ và các biến khác là nó có thể thay đổi giá trị của ô địa chỉ đó.

Mình đang không hiểu là cái khái niệm "+ Vùng nhớ con trỏ. ( Để lưu giá trị của con trỏ )" nó được bịa đặt ở đâu ra vậy ?
 

boyfriend

Búa Gỗ Đôi
Giá trị của con trỏ là gì vậy bạn?
Theo mình biết thì khi khai báo một pointer thì nó sẽ lưu lại địa chỉ của biến mà nó trỏ tới. Tức là chỉ có địa chỉ con trỏ, và miền nhớ con trỏ.
bạn hiểu đơn giản về con trỏ thế này.
Biến con trỏ cũng giống như các biến khác.
Biến gồm 2 thành phần: Địa chỉ và giá trị(theo đúng kiểu của nó).
Biến int thì có địa chỉ và có giá trị theo kiểu int ( Biểu diễn các số nguyên)
Biến float thì có địa chỉ và có giá trị theo kiểu float ( Biểu diễn các số thực)

Biến con trỏ thì nó cũng có địa chỉ, và nó có giá trị theo kiểu point ( Biểu diễn các ô địa chỉ)
Điểm khác biệt giữa biến con trỏ và các biến khác là nó có thể thay đổi giá trị của ô địa chỉ đó.

Mình đang không hiểu là cái khái niệm "+ Vùng nhớ con trỏ. ( Để lưu giá trị của con trỏ )" nó được bịa đặt ở đâu ra vậy ?
Giờ mình hiểu vấn đề hơn rồi các bạn, mình bị nhầm lẫn. Con trỏ cuối cùng thực chất vẫn chỉ có 2 thành phần:
+ Địa chỉ con trỏ
+ Miền nhớ con trỏ.

=======================================

Vùng nhớ con trỏ tức là:

Khi các bạn trỏ tới một địa chỉ nào đó, thì nó lấy vùng nhớ của địa chỉ nó làm vùng nhớ cho nó, tức là chung 1 vùng nhớ trong RAM.

Nhưng với trường hợp, bạn không muốn trỏ tới biến toàn cục, biến cục bộ, nói chung không muốn trỏ tới bất kì biến nào trong chương trình, mà bạn chỉ muốn gán giá trị cho nó, bạn không thể khai báo:

int *b = 15;

Nó sẽ báo lỗi, vì chưa có bất kì vùng nhớ nào để lưu giá trị 15. Vì thế mình phải tạo một vùng nhớ trong thanh Ram do mình quản lý ( Heap Segment ), và mình trỏ con trỏ tới vùng nhớ đó là => biến con trỏ có giá trị.

+ Vùng nhớ: Mình đang nói khái quát vì mình có thể tạo nhiều con trỏ trỏ vào một mảng. Thì mảng chính là một vùng nhớ. Ví dụ trong C là gọi hàm calloc.

=========================================
Chung quy lại tất cả: thì con trỏ cũng chỉ có 2 thành phần:
+ Địa chỉ con trỏ.
+ Miền nhớ con trỏ.

Nhưng nếu muốn con trỏ có giá trị thì tạo một vùng nhớ trong Ram và trỏ con trỏ tới đó.
 

nhoxboy2010

Rìu Sắt Đôi
Nhưng với trường hợp, bạn không muốn trỏ tới biến toàn cục, biến cục bộ, nói chung không muốn trỏ tới bất kì biến nào trong chương trình, mà bạn chỉ muốn gán giá trị cho nó, bạn không thể khai báo:

int *b = 15;

Nó sẽ báo lỗi, vì chưa có bất kì vùng nhớ nào để lưu giá trị 15. Vì thế mình phải tạo một vùng nhớ trong thanh Ram do mình quản lý ( Heap Segment ), và mình trỏ con trỏ tới vùng nhớ đó là => biến con trỏ có giá trị.

Này là do syntax rồi bạn, nếu khai báo như trên thì pointer sẽ trỏ tới địa chỉ 0x15. Muốn gán giá trị thì phải khai báo:

C:
int *b;
*b = 15;
 

boyfriend

Búa Gỗ Đôi
Này là do syntax rồi bạn, nếu khai báo như trên thì pointer sẽ trỏ tới địa chỉ 0x15. Muốn gán giá trị thì phải khai báo:

C:
int *b;
*b = 15;
Mình đã chạy thử lệnh của bạn, nó báo như thế này:
cả C và C++;

Nó báo lỗi dòng 7 với C/C++


Sau khi khai báo vùng nhớ thì mới gán được:
 
Sửa lần cuối:

dammage

Rìu Chiến
Giờ mình hiểu vấn đề hơn rồi các bạn, mình bị nhầm lẫn. Con trỏ cuối cùng thực chất vẫn chỉ có 2 thành phần:
+ Địa chỉ con trỏ
+ Miền nhớ con trỏ.

=======================================

Vùng nhớ con trỏ tức là:

Khi các bạn trỏ tới một địa chỉ nào đó, thì nó lấy vùng nhớ của địa chỉ nó làm vùng nhớ cho nó, tức là chung 1 vùng nhớ trong RAM.

Nhưng với trường hợp, bạn không muốn trỏ tới biến toàn cục, biến cục bộ, nói chung không muốn trỏ tới bất kì biến nào trong chương trình, mà bạn chỉ muốn gán giá trị cho nó, bạn không thể khai báo:

int *b = 15;

Nó sẽ báo lỗi, vì chưa có bất kì vùng nhớ nào để lưu giá trị 15. Vì thế mình phải tạo một vùng nhớ trong thanh Ram do mình quản lý ( Heap Segment ), và mình trỏ con trỏ tới vùng nhớ đó là => biến con trỏ có giá trị.

+ Vùng nhớ: Mình đang nói khái quát vì mình có thể tạo nhiều con trỏ trỏ vào một mảng. Thì mảng chính là một vùng nhớ. Ví dụ trong C là gọi hàm calloc.

=========================================
Chung quy lại tất cả: thì con trỏ cũng chỉ có 2 thành phần:
+ Địa chỉ con trỏ.
+ Miền nhớ con trỏ.

Nhưng nếu muốn con trỏ có giá trị thì tạo một vùng nhớ trong Ram và trỏ con trỏ tới đó.
khái niệm con trỏ này tui thấy dễ ẹc mà ta

Untitled.jpg

một biến tổng quát nhất sẽ gồm 2 thuộc tính, địa chỉ và nội dung dữ liệu, chẳng hạn
biến a có địa chỉ là 1000, dữ liệu nó chứa là con số 12
biến b có địa chỉ là 1001, dữ liệu nó chứa là con số 0
.......

biến con trỏ cũng là 1 biến như mọi biến khác, nó cũng có địa chỉ và nội dung, chỉ có điều nội dung nó chứa chính là địa chỉ của 1 biến khác, như cái hình ở trên, biến f có địa chỉ ở 1005, giá trị nó chứa là 1007, chính là địa chỉ của biến h, ta nói nó là biến con trỏ trỏ tới 1007

nói tổng quát hơn, bất kì giá trị nào mà nó chứa đều được coi là địa chỉ
giả sử bạn gán cho nó 1000 sẽ thành ra f trỏ tới a
giả sử bạn gán cho nó 1004 sẽ thành ra f trỏ tới e
giả sử bạn gán cho nó 1005 sẽ thành ra f trỏ tới chính nó luôn
giả sử bạn gán cho nó ngày sinh của mozart là 27011756 (27/1/1756) sẽ thành ra f trỏ tới 1 vùng nhớ nào đó ở 27011756

giờ nói tiếp tới đoạn code này, hình như bạn hiểu sai cái dấu * chỗ này
Mã:
int* b;
*b = 15;
cái int ở trong khai báo trên nghĩa là b sẽ dùng để trỏ tới biến kiểu int, nếu sửa lại là float thì nghĩa là b dùng để trỏ tới biến kiểu float, khai báo long thì b trỏ tới biến long.... còn kiểu thực sự của con trỏ là kiểu build in do trình biên dịch tự ngầm định

trong 2 dòng trên, dòng đầu là 1 statement, dòng thứ 2 là expression, dấu * ở dòng đầu chỉ đơn giản là 1 kí tự để khai báo biến con trỏ, còn dấu * thứ 2 là toán tử dereference, hiểu nôm na là để truy xuất gián tiếp thông qua con trỏ, bởi vì b ở đây chưa cho trỏ tới biến nào nên gán kiểu này là sai

dòng thứ 2 bạn phải mừng vì trình biên dịch báo lỗi, nó mà im cho chạy luôn mới là thảm họa, khi mới khai báo, biến con trỏ b có thể chứa 1 giá trị rác ngẫu nhiên nào đó (chẳng hạn 12321), đồng nghĩa với việc nó trở tới 1 vùng nhớ ngẫu nhiên mà ở đó có thể chứa dữ liệu quan trọng, giờ bạn gán *b = 15 làm thay đổi dữ liệu ở đó có thể dẫn tới crash chương trình hoặc nguy hiểm hơn, sai lệch kết quả tính toán (giống như thằng nào ghét mình thà nói thẳng để biết đường tránh, còn hơn nó cứ im im rồi âm thầm đâm sau lưng), đây cũng là lý do vì sao c không khuyến khích gán địa chỉ trực tiếp cho biến con trỏ, trừ khi bạn phải thật hiểu những gì mình làm

đối với biến con trỏ người ta có quy ước 1 giá trị đặc biệt là NULL (hoặc nullptr), con trỏ mà bằng NULL nghĩa là nó không trỏ tới đâu, khi bạn mới khai báo con trỏ, nếu chưa sử dụng nó liền thì nên gán = NULL cho chắc ăn

như đã nói ở trên, biến con trỏ cũng là 1 biến và cũng có vùng nhớ riêng cho nó như những biến khác thôi, bạn hoàn toàn có thể dùng nó để chứa dữ liệu như bình thường
Untitled.jpg

dùng b để chứa giá trị 13 sau đó làm phép cộng như học sinh tiểu học thôi, cái này là để minh họa cho bạn hiểu thêm về bản chất của biến con trỏ thôi chứ không khuyến khích xài nó theo kiểu này, biến con trỏ vốn sinh ra không phải để làm như vậy, nếu vậy xài biến thường cho rồi tội gì phải ép kiểu lung tung cho mắc công

còn cái này nữa, khai báo int* b không sai về cú pháp, nhưng theo tui sai về mặt tư duy ngôn ngữ, dấu * là đi với biến chứ không phải với kiểu, chẳng hạn
int *b, a;
thì b ở đây là kiểu con trỏ, trong khi a vẫn là biến int thông thường, trích chap 5 sách c language programming 2nd edition do chính cha đẻ của c viết ra
Untitled.jpg


cái này cũng tùy phong cách mỗi người nhưng bạn nên nhớ là vậy

rồi, nhớ thêm được gì thì viết nữa chứ dài quá
 
Sửa lần cuối:

boyfriend

Búa Gỗ Đôi
khái niệm con trỏ này tui thấy dễ ẹc mà ta


một biến tổng quát nhất sẽ gồm 2 thuộc tính, địa chỉ và nội dung dữ liệu, chẳng hạn
biến a có địa chỉ là 1000, dữ liệu nó chứa là con số 12
biến b có địa chỉ là 1001, dữ liệu nó chứa là con số 0
.......

biến con trỏ cũng là 1 biến như mọi biến khác, nó cũng có địa chỉ và nội dung, chỉ có điều nội dung nó chứa chính là địa chỉ của 1 biến khác, như cái hình ở trên, biến f có địa chỉ ở 1005, giá trị nó chứa là 1007, chính là địa chỉ của biến h, ta nói nó là biến con trỏ trỏ tới 1007

nói tổng quát hơn, bất kì giá trị nào mà nó chứa đều được coi là địa chỉ
giả sử bạn gán cho nó 1000 sẽ thành ra f trỏ tới a
giả sử bạn gán cho nó 1004 sẽ thành ra f trỏ tới e
giả sử bạn gán cho nó 1005 sẽ thành ra f trỏ tới chính nó luôn
giả sử bạn gán cho nó ngày sinh của mozart là 27011756 (27/1/1756) sẽ thành ra f trỏ tới 1 vùng nhớ nào đó ở 27011756

giờ nói tiếp tới đoạn code này, hình như bạn hiểu sai cái dấu * chỗ này
Mã:
int* b;
*b = 15;
cái int ở trong khai báo trên nghĩa là b sẽ dùng để trỏ tới biến kiểu int, nếu sửa lại là float thì nghĩa là b dùng để trỏ tới biến kiểu float, khai báo long thì b trỏ tới biến long.... còn kiểu thực sự của con trỏ là kiểu build in do trình biên dịch tự ngầm định

trong 2 dòng trên, dòng đầu là 1 statement, dòng thứ 2 là expression, dấu * ở dòng đầu chỉ đơn giản là 1 kí tự để khai báo biến con trỏ, còn dấu * thứ 2 là toán tử dereference, hiểu nôm na là để truy xuất gián tiếp thông qua con trỏ, bởi vì b ở đây chưa cho trỏ tới biến nào nên gán kiểu này là sai

dòng thứ 2 bạn phải mừng vì trình biên dịch báo lỗi, nó mà im cho chạy luôn mới là thảm họa, khi mới khai báo, biến con trỏ b có thể chứa 1 giá trị rác ngẫu nhiên nào đó (chẳng hạn 12321), đồng nghĩa với việc nó trở tới 1 vùng nhớ ngẫu nhiên mà ở đó có thể chứa dữ liệu quan trọng, giờ bạn gán *b = 15 làm thay đổi dữ liệu ở đó có thể dẫn tới crash chương trình hoặc nguy hiểm hơn, sai lệch kết quả tính toán (giống như thằng nào ghét mình thà nói thẳng để biết đường tránh, còn hơn nó cứ im im rồi âm thầm đâm sau lưng), đây cũng là lý do vì sao c không khuyến khích gán địa chỉ trực tiếp cho biến con trỏ, trừ khi bạn phải thật hiểu những gì mình làm

đối với biến con trỏ người ta có quy ước 1 giá trị đặc biệt là NULL (hoặc nullptr), con trỏ mà bằng NULL nghĩa là nó không trỏ tới đâu, khi bạn mới khai báo con trỏ, nếu chưa sử dụng nó liền thì nên gán = NULL cho chắc ăn

như đã nói ở trên, biến con trỏ cũng là 1 biến và cũng có vùng nhớ riêng cho nó như những biến khác thôi, bạn hoàn toàn có thể dùng nó để chứa dữ liệu như bình thường

dùng b để chứa giá trị 13 sau đó làm phép cộng như học sinh tiểu học thôi, cái này là để minh họa cho bạn hiểu thêm về bản chất của biến con trỏ thôi chứ không khuyến khích xài nó theo kiểu này, biến con trỏ vốn sinh ra không phải để làm như vậy, nếu vậy xài biến thường cho rồi tội gì phải ép kiểu lung tung cho mắc công

còn cái này nữa, khai báo int* b không sai về cú pháp, nhưng theo tui sai về mặt tư duy ngôn ngữ, dấu * là đi với biến chứ không phải với kiểu, chẳng hạn
int *b, a;
thì b ở đây là kiểu con trỏ, trong khi a vẫn là biến int thông thường, trích chap 5 sách c language programming 2nd edition do chính cha đẻ của c viết ra


cái này cũng tùy phong cách mỗi người nhưng bạn nên nhớ là vậy

rồi, nhớ thêm được gì thì viết nữa chứ dài quá


Cám ơn bạn nhiều. Hoá ra có thể gán bởi ép kiểu. Còn cái int*b; là do VS nó tự định dạng đó bạn.
 

NgoHungCuong


Junior Moderator
Thành viên BQT
khái niệm con trỏ này tui thấy dễ ẹc mà ta

một biến tổng quát nhất sẽ gồm 2 thuộc tính, địa chỉ và nội dung dữ liệu, chẳng hạn
biến a có địa chỉ là 1000, dữ liệu nó chứa là con số 12
biến b có địa chỉ là 1001, dữ liệu nó chứa là con số 0
.......

biến con trỏ cũng là 1 biến như mọi biến khác, nó cũng có địa chỉ và nội dung, chỉ có điều nội dung nó chứa chính là địa chỉ của 1 biến khác, như cái hình ở trên, biến f có địa chỉ ở 1005, giá trị nó chứa là 1007, chính là địa chỉ của biến h, ta nói nó là biến con trỏ trỏ tới 1007

nói tổng quát hơn, bất kì giá trị nào mà nó chứa đều được coi là địa chỉ
giả sử bạn gán cho nó 1000 sẽ thành ra f trỏ tới a
giả sử bạn gán cho nó 1004 sẽ thành ra f trỏ tới e
giả sử bạn gán cho nó 1005 sẽ thành ra f trỏ tới chính nó luôn
giả sử bạn gán cho nó ngày sinh của mozart là 27011756 (27/1/1756) sẽ thành ra f trỏ tới 1 vùng nhớ nào đó ở 27011756

giờ nói tiếp tới đoạn code này, hình như bạn hiểu sai cái dấu * chỗ này
Mã:
int* b;
*b = 15;
cái int ở trong khai báo trên nghĩa là b sẽ dùng để trỏ tới biến kiểu int, nếu sửa lại là float thì nghĩa là b dùng để trỏ tới biến kiểu float, khai báo long thì b trỏ tới biến long.... còn kiểu thực sự của con trỏ là kiểu build in do trình biên dịch tự ngầm định

trong 2 dòng trên, dòng đầu là 1 statement, dòng thứ 2 là expression, dấu * ở dòng đầu chỉ đơn giản là 1 kí tự để khai báo biến con trỏ, còn dấu * thứ 2 là toán tử dereference, hiểu nôm na là để truy xuất gián tiếp thông qua con trỏ, bởi vì b ở đây chưa cho trỏ tới biến nào nên gán kiểu này là sai

dòng thứ 2 bạn phải mừng vì trình biên dịch báo lỗi, nó mà im cho chạy luôn mới là thảm họa, khi mới khai báo, biến con trỏ b có thể chứa 1 giá trị rác ngẫu nhiên nào đó (chẳng hạn 12321), đồng nghĩa với việc nó trở tới 1 vùng nhớ ngẫu nhiên mà ở đó có thể chứa dữ liệu quan trọng, giờ bạn gán *b = 15 làm thay đổi dữ liệu ở đó có thể dẫn tới crash chương trình hoặc nguy hiểm hơn, sai lệch kết quả tính toán (giống như thằng nào ghét mình thà nói thẳng để biết đường tránh, còn hơn nó cứ im im rồi âm thầm đâm sau lưng), đây cũng là lý do vì sao c không khuyến khích gán địa chỉ trực tiếp cho biến con trỏ, trừ khi bạn phải thật hiểu những gì mình làm

đối với biến con trỏ người ta có quy ước 1 giá trị đặc biệt là NULL (hoặc nullptr), con trỏ mà bằng NULL nghĩa là nó không trỏ tới đâu, khi bạn mới khai báo con trỏ, nếu chưa sử dụng nó liền thì nên gán = NULL cho chắc ăn

như đã nói ở trên, biến con trỏ cũng là 1 biến và cũng có vùng nhớ riêng cho nó như những biến khác thôi, bạn hoàn toàn có thể dùng nó để chứa dữ liệu như bình thường
dùng b để chứa giá trị 13 sau đó làm phép cộng như học sinh tiểu học thôi, cái này là để minh họa cho bạn hiểu thêm về bản chất của biến con trỏ thôi chứ không khuyến khích xài nó theo kiểu này, biến con trỏ vốn sinh ra không phải để làm như vậy, nếu vậy xài biến thường cho rồi tội gì phải ép kiểu lung tung cho mắc công

còn cái này nữa, khai báo int* b không sai về cú pháp, nhưng theo tui sai về mặt tư duy ngôn ngữ, dấu * là đi với biến chứ không phải với kiểu, chẳng hạn
int *b, a;
thì b ở đây là kiểu con trỏ, trong khi a vẫn là biến int thông thường, trích chap 5 sách c language programming 2nd edition do chính cha đẻ của c viết ra

cái này cũng tùy phong cách mỗi người nhưng bạn nên nhớ là vậy

rồi, nhớ thêm được gì thì viết nữa chứ dài quá
Bạn dùng IDE nào nhìn lạ thế nhỉ?
 

NgoHungCuong


Junior Moderator
Thành viên BQT
hàng cổ đại đó bạn , được cái nhanh nhỏ nhẹ nên tui hay xài để test nhanh 1 số thứ
Tên là gì thế bác? À mình thấy rồi. Nó là borland c++ phiên bản 5. Cỡ năm 1997
 
Sửa lần cuối:


Top