30/09/2018, 17:06

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

Sáng Béo viết 19:10 ngày 30/09/2018

hàm scanf viết như vậy có sai không ạ

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.

Nguyễn Hữu Điền viết 19:13 ngày 30/09/2018

Như mình biết thì toán tử & đế lấy địa chỉ biến và dùng trong hàm scanf(), hàm scanf() 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);

... viết 19:16 ngày 30/09/2018

Ý thầy của bạn muốn bạn làm như này

void vidu ( int *n) 
{ 
    printf ("nhap n \n");
    scanf ("%d", n);
}

Kệ thầy thôi, code là quyền mỗi người.

abcxyz viết 19:21 ngày 30/09/2018

: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 " )"

abcxyz viết 19:21 ngày 30/09/2018

ừ, 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

abcxyz viết 19:07 ngày 30/09/2018

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

Thành Phạm viết 19:09 ngày 30/09/2018

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

abcxyz viết 19:10 ngày 30/09/2018

mình có đoạn chương trình sau

#include <conio.h>
#include <stdio.h>

int thamTri ( int );                    //  khai bao prototype
int thamBien( int * );    
int thamChieu( int & );
    
main ( )
{
    int a;
    thamTri(a);
    thamBien(&a);
    thamChieu(a);
    getch();
}
 
int thamTri ( int a )              // dinh nghia ham
{ 
     printf ("Nhap a \n");   
     scanf  ("%d", &a);               // nhap gia tri trong ham 
     printf ("In a = %d ", a );      // in gia tri trong ham
     a -= 1;                               // thao tac tinh toan trong ham voi bien truyen vao
     return (a);                         // tra ve gia tri trong ham
}

int thamBien( int *a)
{
    printf ("Nhap a \n");
    scanf  ("%d", ....... );         // .... xét ở dưới
    printf ("In a = %d ",  *a );
    *a=*a-1;   
     return (*a);   
}

void thamChieu( int &a)
{
    printf ("Nhap a \n");
    scanf ("%d", &a);
    printf ("In a = %d", a);
     a -= 1;     
     return (a);
}

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 Phạm viết 19:12 ngày 30/09/2018

Thứ nhất:
Dòng này phải thay void = int

void thamChieu( int &a)

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

abcxyz viết 19:15 ngày 30/09/2018

cho mình xin full bộ tài liệu đó được không? tks

abcxyz viết 19:07 ngày 30/09/2018

Bạn tham khảo thêm về con trỏ ở đây nhá http://daynhauhoc.com/clicks/track?url=%2Fclicks%2Ftrack%3Furl%3Dhttp%3A%2F%2Fbit.ly%2F1JwdEjz%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

Thành Phạm viết 19:19 ngày 30/09/2018

Hello every body. Long time no see! Trước tiên mình xin gửi lời cảm ơn đến Mr.Đạt vì đã tạo ra một sân chơi chung cho mọi người có cơ hội học tập và trao đổi kiến thức IT với nhau. Tiếp theo là cảm ơn các bạn đã ủng hộ Chương 1 của mình trong thời gian qua. Vì tính mình khá trau chuốt, bên cạnh đó lại bận bịu việc riêng việc chung lung tung beng nên thời gian ấp và ủ hơi lâu, thành thật sorry các bạn, nhưng vì 1 tương lai của một bộ tài liệu học lập trình hay cho con em chúng ta, đành phải…

Huy Nguyễn viết 19:07 ngày 30/09/2018

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

Bài liên quan
0