Thắc mắc về tham biến con trỏ trong C
phần tham biến con trỏ trong c, khi em truyền tham biến con trỏ vào tham số hình thức của hàm , trong hàm e có sử dụng scanf để nhập dữ liệu cho biến đó như sau :
scanf ("%d", &*a); tại sao trong dev có dấu * trong & *a thì chạy nó báo không báo lỗi, vẫn chạy được,kết quả đúng, còn trong codeblock thì không chạy được , báo lỗi, và hàm scanf viết như vậy có sai không ạ?
void vidu ( int *n)
{
printf ("nhap n
");
scanf ("%d", &*n);
}
e bị trừ 2 điểm vì chỗ dấu * đó trong bài kiểm tra , máy e vẫn chạy và cho ra kết quả đúng mà máy thầy chạy báo lỗi, :v
Tks
thiếu đóng ngoặc nhé.
Theo mình thấy thì không sai, chắc thầy cô giáo quá máy móc nên mới trừ điểm. vì nếu chỉ nhập hàm thì cái scanf nó cũng trỏ đến ô nhớ để nhập giá trị vào rồi mà.
P/S: mình chưa chắc chắn.
Như mình biết thì toán tử
&
đế lấy địa chỉ biến và dùng trong hàmscanf()
, hàmscanf()
sẽ lưu giá trị ta nhập vào biến đó, như vậy thì dù n là biến thường hay n biến con trỏ thì dùng&
trong câu lệnhscanf()
đều không sai. Hơn nữa ở đây n là con trỏ, mà con trỏ thì đã có địa chỉ riêng của nó nên có thể bỏ luôn&*
tức làscanf("%d", n)
;Ý thầy của bạn muốn bạn làm như này
Kệ thầy thôi, code là quyền mỗi người.
:3 Nhưng khổ nỗi trong dev c++ không có * trong &*n thì nó chạy bị lỗi ở bước nhập n, mà trong codeblock lại lỗi khi có dấu * , mình ghi thiếu dấu " )"
ừ, cách truyền tham biến con trỏ, tham chiếu , tham trị mình đã hiểu rồi, nhưng hôm đó viết nhầm thừa mất dấu * nên bị trừ, mà trong dev c++ không có dấu * trong &*n thì không chạy được, bạn thử đi
có 3 kiểu n, &n , &*n
đồng ý là sách dạy n và &n, nhưng không hiểu sao dev c++ không có * trong &*n thì chạy bị lỗi ngay
n là địa chỉ của biến *n => &n thì là địa chỉ của địa chỉ
n không phải là biến con trỏ mà chỉ có *n mới là biến con trỏ, do n không phải là biến nên nó không thể có địa chỉ được => &n vô nghĩa
Bạn chú ý đừng đăng nhiều comment cùng lúc như vậy nhé (bôi đen comment của người bạn trả lời rồi xong quote)
Cách comment ở diễn đàn
mình có đoạn chương trình sau
test trên 3 ide cfree 5, codeblock 13.12, dev c++ 5.10
hàm tham trị cả 3 chạy tốt
hàm tham biến thì hơi ngộ ngộ
xét scanf ở hàm tham biến
scanf ("%d", …);
… để a
thì cả 3 ide đều chạy tốt
… để &*a
dev c++ chạy tốt, codeblock lúc được lúc không, cfree chạy tốt
… để &a
dec c++ chạy lỗi, codeblock lúc được lúc không, cfree k chạy được
ở hàm tham chiếu
trên codeblock và cfree không lưu file code đó thì chạy được
nhưng lưu lại 1 phát rồi chạy thì báo lỗi
trên dev c++ thì chạy báo lỗi ( dev c++ lưu rồi mới được biên dịch)
vậy tóm lại là như thế nào?
Thứ nhất:
Dòng này phải thay void = int
Thứ 2:
Truyền tham chiếu thì chỉ có ở C++ nên khi chạy chú ý đừng nhầm sang C, lỗi ngay =>kiểm tra lại các IDE để C++ hết chưa
Thứ 3:
Đối với hàm này:
int thamBien( int *a)
thì truyền vào phải là một địa chỉ của một biến, tức là ở trong phạm vi hàm đó a sẽ là địa chỉ của biến mà mình truyền vào, còn*a
là giá trị của biến đó=>&a
địa chỉ của biến con trỏ=>*&a
là giá trị mà biến con trỏ đang chứa*&a=a
. Còn&*a
là địa chỉ của biến*a
=>&*a=a
Ở trong hàm bạn In mấy cái này ra xem là hiểu thôi:
a,*a,&a,&*a,*&a
Bạn tham khảo thêm về con trỏ ở đây nhá
http://daynhauhoc.com/clicks/track?url=%2Fclicks%2Ftrack%3Furl%3Dhttp%253A%252F%252Fbit.ly%252F1JwdEjz%26post_id%3D31480%26topic_id%3D7038&post_id=31480&topic_id=7038
cho mình xin full bộ tài liệu đó được không? tks
cho mình xin full bộ tài liệu đó được không>
tks
Nếu không nhầm thì cfree và codeblock dùng compiler là gcc. Dev c++ dùng compiler khác nên có sự khác biệt