THAM CHIẾU VÀ THAM TRỊ

Một trong những vấn đề các bạn mới học C/C++ hay gặp lỗi là truyền tham số khi gọi hàm, trong bài này mình sẽ giải thích kỹ để các bạn có thể hiểu rõ.

Trước khi bắt đầu các bạn nên đọc qua 2 bài viết về con trỏbộ nhớ stack.

Như đã biết, khi gọi hàm, tham số sẽ được tạo ra trên stack và được giải phóng NGAY KHI kết thúc. Có nghĩa là các giá trị của nó sẽ bị hủy. Giả sử bạn có một hàm được khai báo là void f(int n), khi bạn gọi f(m), trước khi thực thi, tham số n sẽ được tạo ra trên stack, giá trị của m sẽ được sao chép vào n. Bên trong f sẽ không có bất kỳ liên hệ nào với m, nên khi kết thúc hàm trở về, ta sẽ thấy m vẫn còn mang giá trị cũ, vì những gì thay đổi trên n là thay đổi biến n trong stack.Trong C chỉ có 1 cách truyền đó nên khi muốn giữ lại giá trị của tham số, ta phải quy ước là truyền con trỏ cho hàm, và bên trong hàm đó bạn sẽ thao tác trên vùng nhớ mà con trỏ đó trỏ đến.Như vậy khi ta khai báo fx(int *n), rồi gọi fx(&m) thì một biến con trỏ sẽ được tạo ra trên stack, giá trị của nó sẽ được sao chép từ địa chỉ của m. Bên trong fx, khi nói đến n nghĩa là đang nói đến địa chỉ của m, do vậy *n chính là biến m, thay đổi giá trị của *n cũng chính là thay đổi m.Trong C chỉ có một cách duy nhất là truyền theo tham trị, truyền theo con trỏ cũng chỉ là truyền theo tham trị, chỉ khác là bạn dùng biến có kiểu con trỏ mà thôi, bên trong hàm bạn vẫn phải xử lý biến đó theo cách sử dụng con trỏ.Hãy đảm bảo bạn đã hiểu toàn bộ phần trên trước khi đọc phần tiếp theo, vì phần trên mới là phần quan trọng nhất.

Continue reading “THAM CHIẾU VÀ THAM TRỊ”

VỀ ĐỊA CHỈ 0

Địa chỉ 0 vốn là một địa chỉ hoàn toàn hợp lệ, tuy nhiên con trỏ có địa chỉ bằng 0 (hay NULL) trong hầu hết các trường hợp là không hợp lệ, tức nếu truy cập vào vùng nhớ thông qua con trỏ có địa chỉ NULL sẽ gây ra lỗi. Nguyên nhân là vì bạn chỉ có thể truy cập vào những vùng nhớ đã-được-cấp-phát, mà vùng 0 thì vốn luôn được sử dụng bởi hệ thống và sẽ không bao giờ sẵn dùng (available) cho ứng dụng của bạn.

❗️Tất cả các vùng nhớ khác cũng vậy chứ không chỉ riêng địa chỉ 0, bạn chỉ có thể đọc ghi vào cùng nhớ được cấp cho việc chứa dữ liệu – ngay cả vùng nhớ đã được cấp cho việc chứa code bạn cũng không được đọc nữa.

– Trong các ngôn ngữ C/C++, NULL chỉ là 1 macro thay thế cho 0.

– Trong Pascal người ta dùng từ khóa nil thay cho NULL.

– Trong Java ta có NullPointerException, .NET có NullReferenceException sẽ throw nếu bạn truy cập vào một biến == null.

VÀI ĐIỀU VỀ OOP DESIGNING

Ở trong bài OOP – chủ đề huyền thoại trong các cuộc phỏng vấn tuyển dụng tôi có nhắc đến OOP designing, trong bài này tôi sẽ nói kỹ hơn về nó.

Hầu hết chúng ta khi nhắc đến OOP đều chỉ nhớ là nó có 3 (hoặc 4) thuộc tính: đóng gói, thừa kế, đa hình và trừu tượng. Thực chất đó chỉ là những công cụ và nguyên liệu, cái quan trọng nhất vẫn là từ những công cụ và nguyên liệu này, bạn sẽ xây nên ngôi nhà như thế nào. Đó cũng là sự khác nhau giữa ông thợ xây và kiến trúc sư, giữa coder và designer. Muốn lên một trình cao hơn, ta cần biết cách sử dụng chúng một cách đúng đắn, và người xưa đã đúc kết ra một số quy tắc. Ta hãy cùng xem qua những nguyên tắc (nếu là một bậc thầy marketing thì sẽ thêm từ “bí mật” 🤮) nhé:

👉 Danh từ tạo nên lớp và thuộc tính, động từ tạo nên phương thức: Có lẽ nhiều người sẽ ngạc nhiên về điều này, nhưng thực ra, viết mô tả các chức năng hệ thống luôn phải là công việc đầu tiên khi thiết kế.

Hãy xem câu sau: “Người dùng nhập họ tên và email để đăng ký, hệ thống sẽ kiểm tra xem Email đã có trong hệ thống hay chưa, nếu có rồi sẽ hiển thị thông báo lỗi, nếu chưa có sẽ lưu vào cơ sở dữ liệu và gửi email chúc mừng đến người dùng vừa đăng ký.”

Trong đoạn văn trên, ta dễ dàng nhận ra một số danh từ: Người dùng, họ tên, email, hệ thống, cơ sở dữ liệu… và một số động từ: đăng ký, kiểm tra (email), hiển thị (thông báo lỗi), lưu (vào CSDL), gửi (email chúc mừng)…

Các danh từ có giá trị đơn (họ tên, email…) sẽ là thuộc tính (property), các danh từ chứa các thuộc tính sẽ là class.Đây là một quy tắc chung, giúp bạn không sai hướng khi phải làm việc với vô số thông tin đầu vào, và bạn có thể bám sát được đề bài. Sau bước này bạn sẽ có một danh sách thô, bạn sẽ phải tinh chỉnh, xem xét cái nào thừa, cái nào thiếu, nhóm chung các lớp cùng chức năng vào chung module… Ở bước này đòi hỏi kỹ năng và kinh nghiệm cửa người thiết kế khá nhiều, và không có cách nào khác là bạn phải thực hành, và tham khảo các dự án nguồn mở.

Continue reading “VÀI ĐIỀU VỀ OOP DESIGNING”

BẠN BIẾT GÌ VỀ INDEX?

Index là một thành phần không thể thiếu khi tối ưu việc truy vấn cơ sở dữ liệu, hiểu rõ về nó là yêu cầu bắt buộc với người thiết kế, và cả người lập trình ứng dụng cơ sở dữ liệu.

❗️Trong bài viết này mình sẽ nói chi tiết về cách thức lưu trữ, vận hành cũng như các yếu tố ảnh hưởng đến Index, nếu bạn chưa biết gì về Index thì đây không phải là bài viết dành cho bạn. Nội dung tập trung vào CSDL Mysql, tuy nhiên các kiến thức này đều có thể áp dụng vào các cơ sở dữ liệu khác như MSSQL hay Oracle, vì hầu hết chúng lưu trữ và vận hành giống nhau, ngoại trừ một số dạng dữ liệu đặc biệt.

Continue reading “BẠN BIẾT GÌ VỀ INDEX?”

BỘ NHỚ STACK LÀ GÌ? TẠI SAO LẠI CÓ LỖI STACK OVERFLOW?

Hiểu về Stack để tránh Stack Overflow!Các bạn mới lập trình chắc hay thấy lỗi này, đặc biệt là khi học đến phần đệ quy, vậy bản chất của nó là gì?

☠️☠️☠️ Lưu ý: bài này chỉ dành cho ai muốn hiểu sâu về kỹ thuật – không chỉ định với người thích ăn xổi ☠️☠️☠️

Mỗi chương trình khi được tải vào máy tính để thực thi sẽ được cung cấp một phần bộ nhớ, phần bộ nhớ này sẽ được chia ra làm nhiều loại, với mục đích khác nhau. Một phần sẽ được dùng để chứa mã lệnh, thường thì phần này sẽ chỉ để đọc và chạy các lệnh chứa trong đó, một phần khác lại được dùng để chứa dữ liệu, bạn có thể đọc và ghi thoải mái, nhưng phải xin cấp phát trước khi dùng (malloc, new…) để tránh ghi đè lên dữ liệu của ứng dụng khác (ta hay gọi là bộ nhớ Heap).

Đọc thêm bài con trỏ để hiểu hơn về bộ nhớ máy tính: https://www.facebook.com/namdotnet/posts/1283909971794016

🧨 Còn một phần đặc biệt nữa gọi là bộ nhớ Stack 🧨

Continue reading “BỘ NHỚ STACK LÀ GÌ? TẠI SAO LẠI CÓ LỖI STACK OVERFLOW?”

BẠN MONG MUỐN MỨC LƯƠNG BAO NHIÊU?

Đã bao nhiêu lần bạn gặp câu hỏi này? Bạn có thấy khó khăn khi trả lời nó không? Làm sao để trả lời theo đúng mong muốn của bạn? Và quan trọng nhất, làm sao để không bị “hớ”?Mức lương cũng như cuộc đời, vô chừng lắm, không hề có một chuẩn mực nào, vậy nên để đạt được mong muốn của mình, đừng quên những nguyên tắc sau:

Continue reading “BẠN MONG MUỐN MỨC LƯƠNG BAO NHIÊU?”

CÂU CHUYỆN VỀ CON TRỎ (POINTER)

Con trỏ là một khái niệm sử dụng rất nhiều khi học về cấu trúc dữ liệu và giải thuật, phần cây hoặc danh sách liên kết. Ở đây mình sẽ nói sâu vào khái niệm này.(lưu ý đây là bài viết sâu về kỹ thuật nên nếu không hiểu thì hỏi chứ không được phàn nàn sao nó quá khó hiểu nhé 😐)

Continue reading “CÂU CHUYỆN VỀ CON TRỎ (POINTER)”

Tiếng Anh có cần cho người lập trình không?

Hỏi nhanh đáp gọn luôn là có!

👉 Vì sao?

– Các tài liệu chuyên ngành hầu hết là viết bằng tiếng Anh, tất nhiên vẫn có tài liệu tiếng Việt, nhưng hoặc viết về những chủ đề cơ bản, hoặc khá chậm cập nhật, và theo cá nhân mình thì đa phần khá í ẹ sau khi dịch xong. Không phải vì người dịch không có kiến thức, mà vì dịch các tài liệu chuyên ngành rất khó.

– Bạn không thể đọc được các bài hỏi đáp trên google, stackoverflow, trong khi đó lại là một nguồn quan trọng giúp giải quyết nhanh các trục trặc phát sinh. Đôi khi tôi tin là nhờ có stackoverflow mà công việc của tôi có thể tiến triển nhanh gấp đôi.

Continue reading “Tiếng Anh có cần cho người lập trình không?”

OOP – chủ đề huyền thoại trong các cuộc phỏng vấn tuyển dụng

Có lẽ các bạn đã từng tham gia phỏng vấn không lạ gì câu hỏi: “Bạn có thể trình bày về lập trình hướng đối tượng được không?”, tại sao nó lại trở thành một chủ đề được quan tâm như vậy? Hãy cùng xem qua những lý do sau nhé.

1. OOP là một cách tư duy: bạn có nhớ lần đầu tiên học về OOP không? Bạn sẽ ngạc nhiên vì sao người ta có thể nghĩ ra những ý tưởng hay đến như vậy, hay đến mức mình làm hoài vẫn không đúng, thậm chí có thể vài năm sau mới nhận ra trước giờ mình toàn làm sai. Cách suy nghĩ của nó khác hoàn toàn với phương pháp lập trình tuyến tính trước đó, và nhờ vậy giúp xây dựng các ứng dụng lớn dễ dàng hơn rất nhiều. Chẳng phải tự nhiên mà hầu hết các nền tảng và ngôn ngữ lập trình hiện tại đều dựa trên, hoặc chí ít là hỗ trợ OOP.

Continue reading “OOP – chủ đề huyền thoại trong các cuộc phỏng vấn tuyển dụng”