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 \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

1 Like

thiếu đóng ngoặc nhé. :smile:

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.

2 Likes

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);

1 Like

Ý 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.

2 Likes

: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

1 Like

n là địa chỉ của biến *n => &n thì là địa chỉ của địa chỉ :smile:
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 :blush:


Bạn chú ý đừng đăng nhiều comment cùng lúc như vậy nhé :blush: (bôi đen comment của người bạn trả lời rồi xong quote)
Cách comment ở DNH

1 Like

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?

1 Like

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á :blush:
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

1 Like

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

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

1 Like


:blush:

1 Like

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

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?