30/09/2018, 17:56

Tại sao không thể truyền số vào cho hàm nhận vào con trỏ kiểu char?

Ví dụ mình có 1 đoạn code sau

 #include <iostream>
#include <string.h>
using namespace std;

void in(char *Ten)
{
    cout << Ten;
}
void In(int *n)
{
    cout << n;
}
int main()
{
    in("Hello chao!");
    In(3);
    return 0;
}

Tại sao mình in chuỗi thì đc mà mình in giá trị 3 thì không được.Cảm ơn các bạn

lâm phúc tài viết 20:06 ngày 30/09/2018

vì bản chất của con trỏ là chỉ vào 1 ô nhớ nào đó nhất định.
bạn cho đối của hàm in là 1 con trỏ và con trỏ đó có giá trị là 3, trong cả triệu triệu tỷ ô nhớ ai biết cái ô nhớ có giá trị là 3 nó chưa cái giống gì, nếu bạn không tin thì có thể khởi động máy lại rồi chạy lại thù có thể ra số khác nữa ấy.
còn đối với chuỗi thì khi bạn chạy hàm In(“Hello…”); thì nó lưu cái mảng chữ Hello… của bạn vào 1 vùng nhớ liên tiếp kiểu char (bên cấp phát bộ nhớ động á) và có 1 biến con trỏ tượng trưng cho cái đống ký tự đó luôn tuy con trỏ đó không có tên nhất định nhưng nó là còn trỏ và truyền vô hàm thì chạy ok :3

lâm phúc tài viết 20:06 ngày 30/09/2018

nếu bác thắc mắc nữa thì thử sửa hàm In() lại thành
printf("%p\n",Ten);
bạn sễ thấy nó sẽ xuất ra tên của con trỏ
nhớ
include stdio.h
luôn nha bác

Ngo Dinh Quyen viết 20:03 ngày 30/09/2018

Trong C++ có 3 loại biến: (phân biệt với các loại giá trị)
Biến giá trị: dùng đề chứa các giá trị(nguyên, thực, kí tự, luận lí): int a; float b; char c…
Biến con trỏ: dùng để chứa - địa chỉ - của - biến giá trị- int *a; int b; a = &b;
Biến tham chiếu
Ở hàm In, tham số hình thức của hàm là 1 con trỏ int thì đối số truyền vào phải là địa chỉ của 1 biến giá trị và trong trường hợp này là biến nguyên…Nên nếu bạn truyền vào giá trị 3 thì sẽ sai vì địa chỉ khác với giá trị mặc dù địa chỉ cũng là 1 con số…
Nếu bạn muốn in ra giá trị 3 sử dụng con trỏ thì ở hàm main, bạn cần:

  • Khai báo và gán giá trị cho 1 biến int: int a = 5;
  • Rồi gọi hàm: In(&a);
明玉 viết 19:58 ngày 30/09/2018
void In(int *n)
{
    cout << n;
}

Như thế này là hiển thị giá trị của con trỏ.
Vầy mới đúng:

void In(int *n)
{
    cout << *n; // giá trị kiểu int mà n trỏ tới
}

Riêng char* thì lại được do cout << nó có overload dành riêng cho kiểu char*, code nó chạy kiểu khác.

Bài liên quan
0