Gán giá trị với kiểu int vào con trỏ bị lỗi [Error] invalid conversion from 'int' to 'int*'

Em chào anh chị ạ. Em có một khúc mắc.

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

int main() {
	// test vs kieu char
	char *daynhauhoc0 = "D"; // không loi
	char daynhauhoc1[]={'D','a','y','n','h','a','u','h','o','c','2','\0'};
	int *daynhauhoc2 = 3; // loi
	
}

Tại sao khi em dùng con trỏ và gán giá trị với kiểu int thì nó báo
[Error] invalid conversion from 'int' to 'int*' [-fpermissive]
còn với kiểu char em lại không gặp lỗi khác kiểu dữ liệu như vậy. Vì em nhớ là con trỏ nó là 1 biến nguyên là chỉ có thể lưu và gán được giá trị là địa chỉ của một biến cùng kiểu với nó. Ở đây char lại gán được giá trị chứ không phải địa chỉ của bất kỳ biến nào ( không cần khai báo biến ).

Và còn một vấn đề nữa khi em commnet câu lệnh lỗi lại và thêm đoạn code để chạy chương trình nó có thể in trức tiếp giá trị của biến daynhauhoc0 mà không cần qua toán tử *. Mọi người giải đáp giúp em với ạ. Em cảm ơn ạ.
Code của em

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

int main() {
	// test vs kieu char
	char *daynhauhoc0 = "D"; // không loi
	char daynhauhoc1[]={'D','a','y','n','h','a','u','h','o','c','2','\0'};
	//int *daynhauhoc2 = 3; // loi
	
	printf("\n in ra daynhauhoc0 = %s",daynhauhoc0);
        return 0;
}

output: in ra daynhauhoc0 = D

1 Like

Hm, cậu cần đọc lại khái niệm con trỏ, ký tự và xâu.

char *daynhauhoc0 = "D";

Cậu biết 1 xâu là 1 mảng các ký tự đúng không?
Khai báo ở trên thực ra là cậu tạo ra mảng các ký tự {‘D’, ‘\0’}, gán địa chỉ của mảng đó cho con trỏ kiểu char daynhauhoc0. Nếu mảng ký tự trên được tạo ra, và lưu ở địa chỉ 0x12345678, thì daynhauhoc0 có giá trị này.
Thực chất, nó khác với việc cậu gán 1 giá trị int cho con trỏ int:

int *daynhauhoc2 = 3; // loi

Nếu cậu gán như thế này thì tương đương nè:

char *daynhauhoc0 = 'D'; // loi

Nó sẽ gặp lỗi tương tự, là cậu gán giá trị char cho con trỏ char.


Và còn một vấn đề nữa khi em commnet câu lệnh lỗi lại và thêm đoạn code để chạy chương trình nó có thể in trức tiếp giá trị của biến daynhauhoc0 mà không cần qua toán tử *.

Ở printf với %s, cậu cần phải truyền địa chỉ của xâu mà cậu muốn in ra. daynhauhoc0 chứa địa chỉ đó (ví dụ: 0x12345678).
Cậu không dùng * (dùng để dereference) vì cậu không muốn truy cập tới giá trị lưu ở địa chỉ. Nếu cậu dereference (dịch tiếng Việt là khử tham chiếu thì phải, tức là cậu sẽ tới và lấy giá trị ở địa chỉ được lưu trong con trỏ), cậu sẽ tới và lấy giá trị char ở địa chỉ 0x12345678, và sẽ được ký tự ‘D’ thôi (không hợp lý đúng không? Cậu muốn in ra cả xâu mà).

Hope it helps!

4 Likes

Em cảm ơn ạ. Chúc anh có thật nhiều sức khỏe.

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