Điểm khác nhau về tham số giữa cin và scanf

Chào anh chị, hiện nay em mới bắt đầu học lập trình và học sắp xong ngôn ngữ C rồi. Hôm nay em có tìm hiểu về C++. Em có chút thắc mắc là vì sao bên scanf thì lại cần địa chỉ của biến như scanf("%d",&vidu); còn bên cin thì lại không cần địa chỉ như cin>>vidu.
Anh chị nào giải đáp thắc mắc giúp em với ạ.

Cách giải thích đơn giản (và ngắn gọn)
scanf của C và cin của C++ là 2 kiến trúc khác nhau.

Cách giải thích dài hơn
C theo concept pass-by-value nên hàm của nó đều copy giá trị được đưa vô. Điều này có nghĩa là một hàm như scanf, nếu như được viết mà không có address operator &

scanf("%d", vidu)

thì nó không thể nào đổi được giá trị vidu, vì tất cả những gì bạn làm chỉ là đổi cái copy của nó thôi. Bạn muốn thay đổi vidu trong scanf() thì bạn phải đụng tới pointer (*&), và cái đó tức nghĩa là bạn phải đụng tới khái niệm memory access trong computer.

C++, cũng là pass-by-value như C, nhưng nó có thêm lợi ích là nó là 1 Object Oriented Language. Nên những hàm của nó thường là 1 object class, như Cin của bạn là 1 object trong class istream chẳng hạng. Mục đích cho những cái object như vậy thường đễ làm mơ hồ đi những khái niệm low level như pointer và memory addressing, làm cho công việc của mấy anh chị programmer bớt căng thẳng hơn :laughing:.

Nên việc cin không xài address operator (&) cũng là chuyện bình thường, bởi vì thường thường người ta không thích đụng tới memory, nó phức tạp lắm, và đặc biệt cho những người mới vô programming và chưa biết mấy cái low level concept như vậy, thì làm việc với memory là 1 ác mộng cho họ.

6 Likes

Vì C chỉ có mặc định là truyền tham trị, nên phải dùng con trỏ để truyền tham biến. Còn lí do vì sao C++ lại có khái niệm reference (đừng nhầm với reference nói chung trong OOP - bao gồm cái tham chiếu này) là để viết những hàm nạp chồng toán tử dễ hơn. https://stackoverflow.com/a/4716476

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?