Cái trên là truyền con trỏ chứ tham biến cái gì
Thế nếu
void doi(float*&a,float*&b)
thì gọi là gì bây giờ
xét bài toán :
nhập 2 số a,b từ bàn phím và đổi thứ tự 2 số a và b đó VD như nhập a=5,b=7 sau đó xuất là a=7,b=5
code
giá trị của biến thay đổi sau khi hàm doi() thực hiện trên địa chỉ 2 biến a,b.cơ chế truyền cho hàm theo địa chỉ được gọi là phương pháp truyền tham biến cho hàm.nếu hàm được truyền tham biến thì nội dung của biến sẽ được thay đổi sau khi thực hiện hàm#include<stdio.h>
#include<conio.h>
void doi(float*a,float*b){
float c;
c=*a;
*a=*b;
*b=c;
}
void main()
{int d;
do{/* su dung cau lenh do while de lam menu lua chon...*/
float a,b;clrscr();
printf("\nnhap a=");
scanf("%f",&a);
printf("\nnhap b=");
scanf("%f",&b);
doi(&a,&b);/* loi goi ham doi()*/
printf("\nsau khi doi gia tri thi\n\n A=%6.2f B=%6.2f\n\n Bam y de tiep tuc",a,b);
d=getch();}while(d=='y');printf("\n\n KET THUC ");getch();}
thảo luận về con trỏ,ta hiểu ngầm về các quy định như sau
toán tử &(tên biến) : dùng để lấy địa chỉ của biến chính xác hơn là lấy địa chỉ ô nhớ dành cho biến
toán tử *(tên biến) dùng để lấy nội dung của ô nhớ dành cho tên biến
Đã được chỉnh sửa lần cuối bởi jacking_nguyen1 : 13-02-2008 lúc 09:22 AM.
Cái trên là truyền con trỏ chứ tham biến cái gì
Thế nếu
void doi(float*&a,float*&b)
thì gọi là gì bây giờ
Biến a ,b này là 1 bí danh của 1 biến trên heap.Code:void doi(float*&a,float*&b)
Ex
Code:#include<conio.h> #include<stdio.h> void doi(int*&a,int*&b){ int x; x=*a; *a=*b; *b=x; } void main() { int b=3,a=2,*a1,*b1; a1=&a; b1=&b; doi(a1,b1); printf("%d,%d",a,b); getch(); }
Time
Biến a ,b này là 1 bí danh của 1 biến trên heap.void doi(float*&a,float*&b)
Chưa hiểu lắm chỗ này ? Làm sao có con trỏ tới tham chiếu ?
Hãy thử nếu ta truyền vào 1 biến nào đó mà biến này không phải là kiểu con trỏ thì compiler luôn luôn báo lỗi nhưng nếu hàm doi() được thiết kế như sau
thì biến a,b lại bi danh của 1 biến nào đó trên Stack nhưng do ta có hàmCode:void doi(float&a,float&b)nên thực ra noi biến a,b bi danh đến 1 biến trên Heap thì đã bỏ qua 1 bước, cụ thể hơn là biến a,b bí danh của 1 biến con trỏ nào đó mà con trỏ này tham chiếu đến 1 biến nào đó trên Stack. Như thế có nghĩa là biến a,b là bí danh của 1 biến nào đó trên HeapCode:void doi(float*&a,float*&b)
Đã được chỉnh sửa lần cuối bởi nthung : 13-02-2008 lúc 11:31 AM.
Time
Nói thế này mới chính xác T_T. Tham chiếu tới con trỏ chứ không có chuyện con trỏ tới tham chiếu. Sorry hiểu nhầm ý bạn nhé do nghe từ bí danh nên hiểu nhầm. Mà mình nghĩ cái này khỏi cần hàm làm gì, thử ra ngay 1 statement là thấy ngay :nên thực ra noi biến a,b tham chiếu đến 1 biến trên Heap thì đã bỏ qua 1 bước, cụ thể hơn là biến a,b tham chiếu đến 1 con trỏ nào đó mad con trỏ này tham chiếu đến 1 biến nào đó
PHP Code:int *p = &x;
int *&*pr = p; //ok
PHP Code:int &r = x;
int *&*rp = &x;//oops
các bạn có đọc kĩ câu cuối của mình không đấy mình đã từng nói rằng cơ chế truyền cho hàm theo địa chỉ của biến được gọi là phương pháp truyền tham biến cho hàm còn gì
Vậy thực chất mục đích của bài này là bàn luận về cái gì nhỉ ?các bạn có đọc kĩ câu cuối của mình không đấy mình đã từng nói rằng cơ chế truyền cho hàm theo địa chỉ của biến được gọi là phương pháp truyền tham biến cho hàm còn gì
Cái nằm trong Quote của anh R2 đơn giản lắm . Thế này , nếu ta khai báo
Trong hàm main ta cóCode:void func(int &a,int &b);
---> ta sẽ có a , b là 2 bí danh của c , d . Tức là a cũng chính là c và b cũng chính là d . Câu thần chú " Orion là Chocopie , Chocopie là Orion " . Ở đây a,b,c,d là kiểu dữ liệu nguyên bình thường .Code:int c,d; func(c,d);
Thế thì viết thế nàyTrong hàm main ta cóCode:int func(int *&p1 , int *&p2);
---> ta sẽ có p1 , p2 là 2 bí danh của h1 , h2 . Tức là p1 cũng chính là h1 và p2 cũng chính là h2 . Chẳng qua chỉ khác nhau ở chỗ đây là kiểu dữ liệu con trỏ thôi .Code:int *h1,*h2; //khai bao 2 con tro h1,h2 kieu nguyen func(h1,h2);