Sai lầm trong suy nghĩ
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 :
- #include <iostream>using namespace std;
- // Check gia tri cua con tro truoc va sau khi goi ham
- int ham(int *a){*a = 2;a++;return *a;}int main(){int c = 5;int *b = &c;cout << "Dia chi truoc khi goi ham = " << b << endl;ham(b);cout << "Dia chi sau khi goi ham = " << b << endl;system("pause");return 0;}
Cách 1 : dùng tham chiếu trong C++
- void ham(int *&a)
- {
- a=new int[100];
- }
- void ham(int **&a)
- {
- a=new int*[100];
- }
Cách 2 này mình chỉ demo thôi, bạn cần phải đọc chi tiếp ở chap con trỏ đa cấp
- #include <stdio.h>
- #include <conio.h>
- void ham(int **a)
- {
- *a=(int*)malloc(100*sizeof(int));
- //a[0]=(int*)malloc(100*sizeof(int));
- // 2 cach nay nhu nay
- }
- void main()
- {
- int *a;
- ham(&a);
- free(a);
- }
- #include <iostream>using namespace std;
- // Check gia tri cua con tro truoc va sau khi goi ham
- int ham(int *&a){*a = 2;a++;return *a;}int main(){int c = 5;int *b = &c;cout << "Dia chi truoc khi goi ham = " << b << endl;ham(b);cout << "Dia chi sau khi goi ham = " << b << endl;system("pause");return 0;}
- #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();
- }
hay qua, thanks admin
ReplyDelete