
Nó sẽ là:
p–; // chuyển đến địa chỉ trước đó (địa chỉ sẽ trừ đi size của kiểu mà p trỏ đến).
x = *p;
int main(int argc, char *argv[])
int main (void)
public static void main(String [] args)
static void Main(string[] args)
def main():
Có lẽ bạn không lạ gì hàm main, hàm đầu tiên bạn viết khi học lập trình C, ngay cả khi chuyển sang một ngôn ngữ khác, nhất là các ngôn ngữ thừa kế từ C như C++, Java và C#, bạn cũng sẽ thấy một hàm tương tự. Đặc trưng của main là nó sẽ nhận vào các tham số (các tham số này được truyền cho chương trình đang chạy từ trên dòng lệnh) và trả về dữ liệu kiểu int hoặc void.
Khi gọi một hàm (sqrt, rand, malloc…), bạn sẽ nhận được kết quả trả về của hàm đó, vậy giá trị trả về của hàm main sẽ trả về cho ai? Và để làm gì?
Vì khi main kết thúc cũng đồng nghĩa với chương trình kết thúc, nên bên trong chương trình bạn không có cách nào lấy giá trị đó (trừ khi bạn cố ý gọi main), mà giá trị này sẽ trả về cho hệ điều hành, hệ điều hành sẽ lưu lại và cho phép chương trình kế tiếp thực thi có thể đọc được. Nhờ khả năng chuyển kết quả thực thi của một chương trình cho một chương trình khác mà ta có thể viết được các chuỗi lệnh (hay các batch scripts, bash scripts…).
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ỏ và 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Ị”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é )