30/09/2018, 17:32

Vấn đề về con trỏ , mảng trong C

E có hai ví dụ sau (e xin phép không khai báo thư viện cho nhanh):

int main()
{
    char string[]="helloworld";
    char *tim=NULL;
    tim=strchr(string,'d');
    if (tim!=NULL)
    {
        printf("ket qua la %s
",tim);
    }
}

Ví dụ 2

int main()
{
    int tuoi=10;
    int *pointer1=&tuoi;
    printf("gia tri cua bien tuoi la %d
",*pointer1);
}

Vấn đề e muốn đặt ra là tại sao ở ví dụ 1 con trỏ (tức biến tim trong phần printf không có dấu sao nhưng nó vẫn in ra giá trị biến kí tự mà nó trỏ vào. Còn nếu có thì lỗi) . Còn ví dụ 2 trong phần printf thì phải có * thì con trỏ mới in ra giá trị biến tuổi nó trỏ vào, còn nêuu không thì nó sẽ in ra giá trị của con trỏ pointer 1. Tại sao lại có sự khác biệt này ạ ??

Mai Anh Dũng viết 19:39 ngày 30/09/2018

Vấn đề e muốn đặt ra là tại sao ở ví dụ 1 con trỏ (tức biến tim trong phần printf không có dấu sao nhưng nó vẫn in ra giá trị biến kí tự mà nó trỏ vào

Bởi vì nó là con trỏ rồi. Lệnh printf với %s sẽ cần một con trỏ kiểu char *. Trong lúc này tim đã là char * như khai báo ở trên, thế nên em không cần phải làm gì nữa cả. Nếu thêm * vào sẽ là sai.

Còn ví dụ 2 trong phần printf thì phải có * thì con trỏ mới in ra giá trị biến tuổi nó trỏ vào, còn nêuu không thì nó sẽ in ra giá trị của con trỏ pointer 1

Bởi vì lệnh printf với %d sẽ cần một biến kiểu int. Trong lúc này pointer1 là một con trỏ kiểu int *. Thế nên em phải đặt một dấu * ở phía trước của pointer1. Điều này có nghĩa ta sẽ tạm thời biến con trỏ kiểu int * pointer1 trở thành một biến kiểu int, không còn là con trỏ nữa.

Như thế nó sẽ phù hợp với yêu cầu của lệnh printf với %d là cần một biến kiểu int.


Mỗi %s, %d, %c, %p, … yêu cầu một kiểu dữ liệu khác nhau. Em xem bảng dữ liệu này để biết mỗi dấu % có ý nghĩa như thế nào.

http://www.cplusplus.com/reference/cstdio/printf/

Minh Xù viết 19:38 ngày 30/09/2018

C.ơn a ! Em hiểu vấn đề rồi ạ !!! Diễn đàn thật bổ ích

Mai Anh Dũng viết 19:34 ngày 30/09/2018

Nếu em thấy câu trả lời của anh đúng thì em bấm vào trên câu trả lời của anh để xác nhận nhé.

Minh Xù viết 19:48 ngày 30/09/2018

E còn 1 bài nữa chưa hiểu a Đạt giải đáp luôn được không ạ ??

Mai Anh Dũng viết 19:44 ngày 30/09/2018

Em lập topic cho câu hỏi khác. Mỗi topic một câu hỏi thôi

Bài liên quan
0