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 :
+ 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
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:
- #include <stdio.h>
- #include <conio.h>
- int ham(int *a)
- {
- *a=2;
- a++;
- }
- void main()
- {
- int *a;
- printf("Truoc : %x",a); //trước và sau khi gọi hàm
- ham(a); //con trỏ a trỏ vào đâu
- printf("Sau %x",a); // thì nó vẫn trỏ vào đó
- getch();
- }
+ 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:
- #include <stdio.h>
- #include <conio.h>
- int ham(int *a)
- {
- *a=2; // làm việc với địa chỉ nhận được
- }
- void main()
- {
- int n;
- ham(&n);// truyền địa chỉ của n vào đây
- // do đó sau hàm này n =2
- getch();
- }
Không có nhận xét nào:
Đăng nhận xét