Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 21 kết quả

Đề tài: Hàm trả về con trỏ sau có đúng không?

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    610

    Mặc định Hàm trả về con trỏ sau có đúng không?

    Trong 1 ebook về C có đoạn sau

    7.7 Pointers to Pointers

    Sometimes it is desirable to pass a pointer to a function and to change the value of the pointer itself; that is, to change what it points to. This can be done using a pointer-to-a-pointer as in the following (rather contrived) example.

    void func(int **pptr, int i, int j)
    {

    if (i<j) *pptr = &i;
    else *pptr = &j;
    }

    This concept may be applied further, so that we can have a pointer-to-a-pointer-to-a-pointer, and so on. But such constructions are rarely necessary.
    Changing the value of a pointer inside a function is just one application of pointers-to-pointers. More frequently they appear in relation to arrays of pointers, which are addressed in Section 8.4.

    Đoạn code ví dụ trên có đúng không
    Mình thấy biến i và j sau khi thoát khỏi hàm thì không tồn tại nữa nên con trỏ trả về sẽ trỏ tới giá trị rác nào đó

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    K&R. Nhiều người bảo nó rất hay. Mình thì không biết nó hay chỗ nào, nhưng ít ra, theo trí nhớ của mình, nó chỉ đưa ra những thí dụ có nội dung, mục đích thực tiễn rõ ràng, không có những thí dụ vớ vẩn (thuần túy hình thức, vô nghĩa, thậm chí vô lý) như thế này.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    610

    Vậy là không đúng rồi. Cảm ơn bạn!
    Ebook mình đọc của Tim Bailey
    Đã được chỉnh sửa lần cuối bởi khoaph : 20-09-2021 lúc 09:53 AM.

  4. #4
    Ngày gia nhập
    07 2011
    Nơi ở
    Moscow-Russia
    Bài viết
    154

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Mình thấy biến i và j sau khi thoát khỏi hàm thì không tồn tại nữa nên con trỏ trả về sẽ trỏ tới giá trị rác nào đó
    Thật kỳ lạ với cách nghĩ này của bạn. Tại sao biến i và j không tồn tại sau khi thoát khỏi hàm? Mình hỏi bạn cái i và j bạn lấy từ đâu? Nó là hai tham số của hàm func(), nhưng nó cũng chính là hai biến ở trong hàm mẹ (hàm trực tiếp gọi tới func()), chỉ khi hàm mẹ này kết thúc thì biến i và j mới bị rút khỏi stack frame của hàm mẹ đó. Nó đâu có liên quan đến việc kết thúc của hàm func()?

    - - - Nội dung đã được cập nhật ngày 20-09-2021 lúc 06:10 PM - - -

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Hàm trả về con trỏ sau có đúng không?
    Và rõ ràng đây không phải là hàm trả về con trỏ.
    A good beginning and a good ending !

  5. #5
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    610

    Trích dẫn Nguyên bản được gửi bởi Moscow Xem bài viết
    Thật kỳ lạ với cách nghĩ này của bạn. Tại sao biến i và j không tồn tại sau khi thoát khỏi hàm? Mình hỏi bạn cái i và j bạn lấy từ đâu? Nó là hai tham số của hàm func(), nhưng nó cũng chính là hai biến ở trong hàm mẹ (hàm trực tiếp gọi tới func()), chỉ khi hàm mẹ này kết thúc thì biến i và j mới bị rút khỏi stack frame của hàm mẹ đó. Nó đâu có liên quan đến việc kết thúc của hàm func()?

    - - - Nội dung đã được cập nhật ngày 20-09-2021 lúc 06:10 PM - - -



    Và rõ ràng đây không phải là hàm trả về con trỏ.
    1. Bạn mất căn bản về truyền tham biến và tham trị rồi
    2. Trên mạng có nhiều tài liệu nói trả về giá trị, nghĩa là, không chỉ trả về giá trị thông qua return value của hàm mà còn qua tham số kiểu ref hoặc pointer của hàm nữa

    - - - Nội dung đã được cập nhật ngày 20-09-2021 lúc 06:47 PM - - -

    Xin lỗi, mình lẫn lộn sang C++ rồi
    Trong C chỉ có truyền tham trị, không có truyền tham chiếu, nhưng ta có thể có được hiệu ứng tương đương với tham chiếu bằng cách sử dụng con trỏ
    @Moscow bạn nên học lại tham trị là gì đi.

  6. #6
    Ngày gia nhập
    07 2011
    Nơi ở
    Moscow-Russia
    Bài viết
    154

    Mặc định Hàm trả về con trỏ sau có đúng không?

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    1. Bạn mất căn bản về truyền tham biến và tham trị rồi
    @Moscow bạn nên học lại tham trị là gì đi.
    Chào bạn, mình thật sự kinh ngạc khi bạn đề cập đến tham chiếu và tham trị ở đây. Nó có liên quan gì đến tham chiếu và tham trị trong câu hỏi của bạn?

    Bạn hãy viết cho mình một đoạn code có sử dụng hàm func(), và hãy giải thích cho mình biết là các biến i và j nó bị mất khi nào? Khi kết thúc hàm func() hay khi kết thúc hàm gọi nó?

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    2. Trên mạng có nhiều tài liệu nói trả về giá trị, nghĩa là, không chỉ trả về giá trị thông qua return value của hàm mà còn qua tham số kiểu ref hoặc pointer của hàm nữa
    Bạn hiểu thế nào là "giá trị trả về của hàm"? Hàm func() yêu cầu trả về một void, mà code của bạn làm gì có trả về con trỏ nào? mà void cũng có phải là con trỏ đâu? Tại sao bạn lại gọi (tiêu đề của topic) là Hàm trả về con trỏ? Nó có trả về con trỏ không?.... Thật kỳ lạ.
    A good beginning and a good ending !

  7. #7
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    610

    Trích dẫn Nguyên bản được gửi bởi Moscow Xem bài viết
    Chào bạn, mình thật sự kinh ngạc khi bạn đề cập đến tham chiếu và tham trị ở đây. Nó có liên quan gì đến tham chiếu và tham trị trong câu hỏi của bạn?

    Bạn hãy viết cho mình một đoạn code có sử dụng hàm func(), và hãy giải thích cho mình biết là các biến i và j nó bị mất khi nào? Khi kết thúc hàm func() hay khi kết thúc hàm gọi nó?


    Bạn hiểu thế nào là "giá trị trả về của hàm"? Hàm func() yêu cầu trả về một void, mà code của bạn làm gì có trả về con trỏ nào? mà void cũng có phải là con trỏ đâu? Tại sao bạn lại gọi (tiêu đề của topic) là Hàm trả về con trỏ? Nó có trả về con trỏ không?.... Thật kỳ lạ.
    Tôi bó tay với bạn rồi

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Trích dẫn Nguyên bản được gửi bởi Moscow Xem bài viết
    ...
    Bạn hãy viết cho mình một đoạn code có sử dụng hàm func(), và hãy giải thích cho mình biết là các biến i và j nó bị mất khi nào? Khi kết thúc hàm func() hay khi kết thúc hàm gọi nó?
    ...
    C Code:
    1. int main(){
    2.   int *a[10];
    3.   func(a,2,3);
    4. }

    Cả 10 phần tử của mảng a[] đều bất định trước lời gọi func(). Và sau lời gọi func(), ehm, cũng thế.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  9. #9
    Ngày gia nhập
    07 2011
    Nơi ở
    Moscow-Russia
    Bài viết
    154

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    C Code:
    1. int main(){
    2.   int *a[10];
    3.   func(a,2,3);
    4. }

    Cả 10 phần tử của mảng a[] đều bất định trước lời gọi func(). Và sau lời gọi func(), ehm, cũng thế.
    Bạn Ada muốn nói đến điều gì từ ví dụ này? Tại sao lại để 2 tham số i và j là một số ? Lúc này thì các câu lệnh lấy địa chỉ trong hàm func() có tác dụng gì đâu? Die là cái chắc.

    Hãy xem:
    C++ Code:
    1. void func(int** pptr, int i, int j)
    2. {
    3.     if (i < j) *pptr = &i;
    4.     else *pptr = &j;
    5. }
    6. int main() {
    7.     int** a = new int*[4];
    8.     for (int k = 0; k < 4; k++)
    9.         a[k] = new int[6];
    10.     int i = 8, j = 5;
    11.     func(a, i, j);
    12.     // Sau khi gọi func thì i và j bị rút ra ư? Và nó sẽ thành giá trị rác ư?
    13.     // Hãy đọc lại câu đầu tiên của bạn xem?????
    14.  
    15.     return 0;
    16. }
    Hai bạn Khoa và Ada không hiểu ý mình rồi, các bạn không biết stack nó hoạt động thế nào. Khi kết thúc lời gọi hàm func() thì mình hỏi các bạn là biến i và j có bị rút ra và chuyển về giá trị rác như bạn Khoa nói ở post đầu tiên không? Thế nào là stack frame của một function?

    Hơn nữa, tại sao bạn Khoa lại gọi ví dụ ban đầu của bạn là Hàm trả về CON TRỎ ? Trời ơi, return của nó kiểu void mà các bạn đi nói là nó trả về kiểu con trỏ? Thật kỳ lạ. Ai hiểu được những thứ mình đang nói hãy giải thích giúp mình cho hai bạn này hiểu giúp. Mình xin cảm ơn.
    Đã được chỉnh sửa lần cuối bởi Moscow : 21-09-2021 lúc 01:02 AM.
    A good beginning and a good ending !

  10. #10
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Trích dẫn Nguyên bản được gửi bởi Moscow Xem bài viết
    Bạn Ada muốn nói đến điều gì từ ví dụ này? Tại sao lại để 2 tham số i và j là một số ? Lúc này thì các câu lệnh lấy địa chỉ trong hàm func() có tác dụng gì đâu? Die là cái chắc.
    Ý mình nói là ngoài hàm func(), i và j không tồn tại, nên a[0] bất định hay nói cách khác, nó trỏ vào rác. Dùng số (2, 3) chỉ để thấy rõ hơn là i, j không tồn tại trong hàm main() mà thôi.

    Đoạn code của bạn cũng thế. Sau vòng for() ở dòng 8, mọi phần tử của mảng a xác định, kể cả a[0]. Nhưng sau lời gọi func(), a[0] trở thành bất định. Nó trỏ vào rác. Nên lệnh delete[] a[0] ở dòng 16 là bất định. Không thể biết chuyện gì sẽ xảy ra.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn