30/09/2018, 17:30
Con trỏ và mảng kí tự trong C++
Các bạn xem xét giúp mình vấn đề này
Đoạn chương trình dưới đây minh họa điều mình muốn nói!
#include <iostream>
using namespace std;
void Function_1(char *pChar)
{
cout << pChar << endl;
}
void Function_2(int *pInt)
{
cout << pInt << endl;
}
int main()
{
Function_1("1 2 3 4 5 6 ");//??? Tại sao nó lại hợp lý?
//Function_2(5);
return 0;
}
Tại sao khi mình truyền một chuỗi kí tự(,hay một kí tự) Function_1 thì các phần tử trong mảng
tự động được tạo ra để con trỏ tham chiếu tới
Nhưng khi mình truyền một số vào Function_2 thì sao nó lại không làm như trên đi???
Mình cảm ơn các bạn nhiều.
Bài liên quan
Fun_2 có tham số là con trỏ mà lại truyền vào int sao được.
Thì mình đang hỏi tại sao đây??? Bạn chưa đọc kỹ à?
what??? đâu phải đơn giản là sửa đâu b. Mình đang hỏi tại sao như vậy lại hợp lệ mà???
Ok. Nếu b nghĩ vậy. B nên bỏ tính tự ái đi, suy nghĩ tích cực thì tốt hơn đấy!
Dù sao, mình chân thành cảm ơn!
theo mình biết thì mảng thực chất cũng là con trỏ nên bạn truyền "1 2 3 4 5 6 " vào hàm trên thì cũng giống như là bạn truyền vào một mảng 13 ký tự (có tính thêm ký tự ‘\0’ không nhỉ) vậy.
tự học, hiểu như vậy ^^! không dám chắc đúng hok ^^! ai cũng cố hộ
Nhưng mình truyền vào chuỗi mà bạn:“1 2 3 4 5 6”
chứ mình đâu truyền char a[]=“1 2 3 4 5 6”? Mình thấy khó hiểu là vì:phải trỏ đến một đối tượng cụ thể chứ nhỉ?
int *pInt là một tham số, bạn cần truyền vào một địa chỉ.
char *pChar cũng cần truyền một địa chỉ vào.
Điều bạn hỏi ở đây là tại sao "1 2 3 4 5 6 " lại có địa chỉ mà 5 lại không có.
Mình nghĩ đó là tính năng của C++. Không cho phép truyền trực tiếp một địa chỉ. Mà phải truyền thông qua tóan tử & (tức là nó có tồn tại trong chương trình). Nhằm tráng truy cập vùng nhớ không được quản lý. Vì lúc này 5 nó hiểu là một địa chỉ, tuy nhiên đây là ý kiến của mình.
p/s: bạn nên trả lời cm nhã nhặn hơn nhé
đối với C++ thì cũng không rõ lý do ^^!
nếu bạn ghi
nhưng nếu
cái này mình cũng chỉ biết được như vậy. không rõ chính xác nó ra sao nữa, đang học mà
"1 2 3 4 5 " kiểu char thì thực chất là truyền vào con trỏ trỏ tới ký tự đầu tiên của chuỗi, còn pInt thì bạn đòi truyền vào là con trỏ nhưng lại đưa cho nó constant thì nó đâu dám nhận.
Là do hàm cout đã override các trường hợp khác nhau. Th của char * thì nó hiểu là 1 chuỗi, còn trong TH khác nó hiểu là địa chỉ con trỏ và nó in ra địa chỉ đó.
Nó làm dc như vậy vì C++ thuộc loại phân biệt kiểu dữ liệu mạnh, nên nó biết truyền vào hàm là char * hay int *
Nếu cần in ra mảng số theo kiểu trên, bạn cũng có thể overload operator << cho stream
chuỗi "1 2 3 4 5 6 " thực chất là một mảng ký tự. Và một mảng cũng chính là một vùng bộ nhớ được cấp phát tĩnh (có nghĩa là không thay đổi hay không trỏ đi chỗ khác được). Vùng nhớ được cấp phát trên đây sẽ chỉ đến phần tử đầu tiên của mảng (chuỗi), như vậy nó chính là một vùng nhớ mà mỗi ô nhớ lưu một phần tử kiểu char. Chính vị vậy, khi gọi hàm Function_1 với chuỗi trên ban đã truyền tham số là một “con trỏ” được cấp phát tĩnh.
Còn Function_2(5) là không đúng, vì 5 ở đây là một giá trị chứ không phải là một địa chỉ. Và đồng thời bạn cũng không thể lấy địa chỉ của số 5 được (kiểu &5, định nghĩa phép toán & không đứng trước một giá trị cụ thể) cho nên giá trị 5 khác kiểu với tham số nên phép gọi hàm này là không hợp lý.
char pChar đã là con trỏ nếu bạn viết như thế thì nó sẽ hiểu là bạn truyền vào địa chỉ còn nếu bạn char *pChar thì nó sẽ hiểu bạn truyền vào giá trị của mảng, còn int *pInt cũng như vậy