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.

Nguyễn Văn Tâm viết 19:43 ngày 30/09/2018

Fun_2 có tham số là con trỏ mà lại truyền vào int sao được.

Đại Dương viết 19:36 ngày 30/09/2018

Thì mình đang hỏi tại sao đây??? Bạn chưa đọc kỹ à?

Đại Dương viết 19:40 ngày 30/09/2018

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à???

Đại Dương viết 19:31 ngày 30/09/2018

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!

Đại Dương viết 19:44 ngày 30/09/2018

Dù sao, mình chân thành cảm ơn!

Đạt Shiro viết 19:43 ngày 30/09/2018

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ộ

Đại Dương viết 19:31 ngày 30/09/2018

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ỉ?

Minh Hoàng viết 19:30 ngày 30/09/2018

void Function_2(int *pInt)
{
cout << pInt << endl;
}

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é

Đạt Shiro viết 19:43 ngày 30/09/2018

đối với C++ thì cũng không rõ lý do ^^!
nếu bạn ghi

int x = 5;
int *pnA = &x;
cout << pnA ; // thì sẽ in địa chỉ của x

nhưng nếu

char anArray[] = "A B C D";
char *pnB = anArray;
cout << pnB; //  thì sẽ lại in ra A B C D

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à

minh tran viết 19:45 ngày 30/09/2018

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

Gió viết 19:43 ngày 30/09/2018

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

Chi Ngo viết 19:45 ngày 30/09/2018

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

Hoan Sò viết 19:41 ngày 30/09/2018

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

Bài liên quan
0