PDA

View Full Version : Hàm với con trỏ?



dangcongchuong
17-04-2009, 15:44
Mấy bạn xem giúp bài này nhé, mình ngẫm mãi mà không hiểu:
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
void myfun(int *p,int *&s);
void main()
{
clrscr();
int x=3;
int *p=&x;
int *s;
myfun(p,s);
cout<<setw(10)<<"x="<<x<<" *p="<<*p<<" *s= "<<*s;
getch();
return;
}
///////
void myfun(int *p,int *&s)
{
s=p;
*s=23;
int x=5;
s=&x;
return;
}
Đáp án là: x=23 *p=23 *s=5
mấy bạn cho mình hỏi: void myfun(int *p,int *&s), trong đó: int *&s là sao vậy nhỉ? mà nó lại cho kết quả thằng x=23, huu, hỏng hỉu ????????
ai giúp tớ thanks nhiều

[=========> Bổ sung bài viết <=========]

ah sẵn xem dùm mình bài này luôn:
không biết sai ở đâu mà nó không in ra ket quả, cũng không báo gì, mà bài này yêu cầu đặt ra co kết quả là: 0.25, mình không hiểu sao nó lại vậy nữa, mong giải thích giúp:
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
float f(float x,int n);
void main()
{
clrscr();
float x=2,a;
int n=-2;
a=f(x,n);
cout<<setw(20)<<a;


getch();
return;
}
/////////////
float f(float x,int n)
{
float ret,xlast;
if(n<0)
ret=1/f(x,-n);
else
if(n==0)
ret=1;
else
if(n==1)
ret=x;
else
{
if(n%2==0)
{
xlast=f(x,n/2);
ret=xlast*xlast;
}
else
{
xlast=f(x,(n-1)/2);
ret=xlast*xlast*x;
}
return ret;
}
}

Đáp án: 0.25

kimduquan
18-04-2009, 15:22
bài thứ nhất là con trỏ trỏ tới con trỏ,bài 2 là phương pháp tính a mũ b bằng phương pháp nhị phân,đại khái là a^b=a^(b/2)*a^(b/2) nếu b chẵn còn a^b=a^(b/2)*a^(b/2)*a nếu b lẻ,ta chỉ cần tính a^(b/2)thì sẽ tính được a^b mà để tính a^(b/2) thì ta gọi đệ quy .bài 2 ko ra kết quả có thể là vì hàm ko trả về giá trị nên ko xuất ra được,tuy nhiên trình biên dịch ko nhận ra lỗi này vì trình biên dịch chỉ yêu cầu trong thân hàm có 1 câu lệnh return là đủ,còn bài của bạn tuy có 1 câu lệnh return nhưng nó lại nằm trong mệnh đề if vì vậy khi mệnh đề if sai thì hàm ko trả về giá trị và nó cứ đứng ở đó mãi nên chương trình cũng đứng theo luôn.

linh040800
18-04-2009, 16:57
Các bạn có thể nói rõ độ mạnh khi sử dụng con trỏ.. Ngay cả khi làm với
file ah

dangcongchuong
18-04-2009, 20:07
ua dung roi day,ban giup thi giup' cho trot luon nha, con tro tro toi con tro la the nao vay ban? minh2 muon' hioeu duoc hoat dong cua no the nao? ban "chay tay" dum minh 2 bai tren thu nha. thanks truoc do, thong cam khong hieu sao may khong bo dau duoc!

[=========> Bổ sung bài viết <=========]

may ban oi! xem lai giup minh bai nay voi. con tro tro toi' con tro la gi vay? huuuuuuuuuu!

kimduquan
21-04-2009, 18:24
trời bài tập đệ quy mà chạy tay là khó chịu lắm đó,bạn sửa lại chương trình rồi cho chương trình chạy thử đi,còn con trỏ trỏ tới con trỏ nghĩa là con trỏ chứa địa chỉ của con trỏ vì con trỏ cũng là 1 biến nên nó cũng có địa chỉ,trong bài thứ nhất thì tham số truyền vào là địa chỉ của con trỏ s,điều đó chỉ có nghĩa là ta đang truyền con trỏ s ở dạng tham biến,khi ta thay đổi con trỏ s trong hàm thì con trỏ s trong hàm main cũng thay đổi theo.

[=========> Bổ sung bài viết <=========]


Các bạn có thể nói rõ độ mạnh khi sử dụng con trỏ.. Ngay cả khi làm với
file ah
con trỏ được sử dụng rất nhiều trong C,theo mình biết thì con trỏ là phương pháp duy nhất để thao tác trên tập tin.

dangcongchuong
21-04-2009, 22:33
uhm dung' la de qui ma chat tay thi hoi bi met, cau 1 ngam mai ma van khong hieu, co le van' de o cho: s=&x; khong biet' no hoat dong the nao? du sao cung thanks kimduquan nhiu

kimduquan
22-04-2009, 08:52
s=&x nghĩa là cho con trỏ s trỏ đến x hay nói cách khác là sau lệnh gán này s sẽ chứa địa chỉ của biến x.

dangcongchuong
22-04-2009, 12:15
hu, biet la nhu the nhung doi voi bai nay! cung hieu con tro tro den con tro la gi. huuhu nhung van khong hieu sao x=23.
huuuu

liluom
22-04-2009, 17:57
chào bạn congchuong.Mình cũng đang nghiên cứu về con trỏ nhìu lắm. Và cái bài 1 của bạn thì mình xem qua và theo mình hiểu thì:
khi khai báo int *p = &x, tức là con trỏ p sẽ trỏ đến địa chỉ của thằng x;
khi chạy đến hàm myfun() thì con trỏ s được gán =p, tức là con trỏ s cũng sẽ trỏ đến địa chỉ của thằng x lun. Nên *s = 23 là đã thay đổi giá trị của địa chỉ thằng x nên mới =23.
Theo mình hiểu thì là như thế!

[=========> Bổ sung bài viết <=========]

à còn thằng &s là truyền kiểu tham chiếu, mọi sự thay đổi giá trị của s bên trong hàm myfun() thì đều tác động lên thằng s ở bên ngoài

dangcongchuong
22-04-2009, 21:49
ah ha.....wao! mình hiểu rồi, chào liluom, thanks bạn nha, mong đươc giúp đỡ trao đổi ở những bài sau

[=========> Bổ sung bài viết <=========]

huu, nhưng câu 2 vẫn chưa....hu

liluom
22-04-2009, 22:46
@dangcongchuong: bạn để return ret bên trong else thế thì làm sao nó trả giá trị về cho hàm được. Bạn chuyển return ret ra ngoài đi.

dangcongchuong
23-04-2009, 11:50
ah thì ra là vậy ah, để mình xem lại, thanks liluom nhieu