Lập trình

Lập trình

Thứ Bảy, 21 tháng 6, 2014

Sai lầm trong suy nghĩ về hàm và con trỏ

Copy ở : condongcviet.com , 

Xem đầy đủ tại đây  Mình post thế này cho tiện :)



Có nhiều thật nhiều người nói rằng trong C, ta có thể sử dụng con trỏ trong tham số của hàm như là 1 tham biến, qua hàm ta có thể thay đổi được giá trị của tham số.
tôi xin khẳng định lại, điều này thật là 1 hiểu lầm, sai lầm trong suy nghĩ, 1 sự hiểu biết nông cạn, 1 câu phát biểu kiểu ù ù cạc cạc!!!

Nguyên nhân
+ Hàm trong C ko hề có tham biến, hàm trong C đều hoạt động theo nguyên tắc sau :
Khi gọi hàm, 1 bản sao của tham số được tạo ra (cấp phát vùng nhớ mới, copy giá trị sang. quá trình này theo giáo trình của đại học FPT gọi là shadow copy, là 1 yếu tố cần quan tầm, 1 C/C++ Developer đừng bao giờ quên điều này), và hàm sẽ làm việc với bản sao này
(trong C++ nó sẽ dùng hàm tạo sao chép để tiến hành quá trình shadow copy này)

+ Vậy khi làm việc với con trỏ thì hàm làm thế nào
vâng, hàm vẫn cứ làm theo nguyên tắc 1 và 1 bản sao của con trỏ được tạo ra, và hàm làm việc với bản sao hàm, và trước khi gọi hàm con trỏ trỏ vào đâu thì nó vẫn được trỏ vào đấy chứng minh :
C++ Code:
  1. #include <stdio.h>
  2. #include <conio.h>
  3.  
  4. int ham(int *a)
  5. {
  6.     *a=2;
  7.     a++;
  8. }
  9. void main()
  10. {
  11.     int *a;
  12.     printf("Truoc : %x",a); //trước và sau khi gọi hàm
  13.     ham(a);                    //con trỏ a trỏ vào đâu
  14.     printf("Sau %x",a);     // thì nó vẫn trỏ vào đó
  15.     getch();
  16. }


+ Vậy tại sao lại có sự thay đổi và tại sao lại sử dụng con trỏ trong hàm? Con trỏ ko thay đổi thì cái gì thay đổi được ?
vâng, các bạn chú ý nhé, giá trị nằm trong vùng nhớ trỏ đến thay đổi. Vâng đúng thế đấy bạn à, do biến của ta nằm trong vùng nhớ được trỏ đến nên nó được thay đổi
C++ Code:
  1. #include <stdio.h>
  2. #include <conio.h>
  3.  
  4. int ham(int *a)
  5. {
  6.     *a=2; // làm việc với địa chỉ nhận được
  7. }
  8. void main()
  9. {
  10.     int n;
  11.     ham(&n);// truyền địa chỉ của n vào đây
  12.     // do đó sau hàm này n =2
  13.     getch();
  14. }

Không có nhận xét nào:

Đăng nhận xét