Hỏi về việc khai báo con trỏ có kiểu dữ liệu khác với nơi trỏ vào

Chào mn, cho em hỏi có ai có tài liệu hay web nào nói về vấn đề trên không cho em xin với (e đã dò google khá kỹ, hiểu sơ sơ như ví dụ dưới đây), e đang muốn hiểu rõ ràng hơn, hoặc có thể giải thích cho em . Xin cảm ơn nhiều lắmmmmm ( ám ảnh cưỡng chế nhẹ).

#include <stdio.h>

int main(){
    int n = 260, *p=&n;
    printf("n= %d\n",n);
    char *pp = (char*)p;
    *pp=0;
    printf("n= %d",n);
    getchar();
    return 0;
}

Đây là giải thích của em:
p = &n ;*p = n = 260; (kiểu int)

  • In ra màn hình giá trị (kiểu int) của n =260
pp = p = &n; *pp = *p = n = 260;

Xem xét con trỏ pp:

  • Con trỏ pp kiểu char => chỉ trỏ được một phạm vi 256 giá trị (-128 -> 127)
    => *pp bị overflow, pp trỏ qua phạm vi giá trị tiếp theo (vẫn thuộc biến n)
    => *pp lúc này có giá trị kiểu int là 4 (phần giá trị tràn ra)

  • Câu lệnh gán *pp = 0 tác động lên phạm vi giá trị đó.
    => n = 256 ( mất 4)

  • In ra màn hình (kiểu int) giá trị của n: n = 256 + 0
    => Màn hình hiển thị n=260 \n n=256

Giải thích hơi khó hiểu, đọc qua có vẻ chưa đúng lắm. (code k format nên thiếu mất mấy dấu * kìa :kissing:)


Bạn chắc cùng trường với bạn này. :smiley:

2 Likes

Em mới học lap trỉnh C có một tháng thôi ạ, không biết kiến thức này nằm ở đâu để tỉm hiểu cả. Mong mn giúp đỡ

mình cũng học qua c với c++ thôi nên không chắc lắm nhưng mà mình nghĩ như này

int n = 260 = 0x00 0x00 0x01 0x04 (1 int 4bytes, thường như vậy, tùy system)
char *p = &n = byte cuối/ hoặc đầu của n = 0x04 (MSB hoặc LSB)
*pp = 0 => byte cuối = 0
=> n = 0x00 0x00 0x01 0x00 = 256

môn c ở trường mình gần như ko code 1 tí nào( mặc dù học embedded) nên không chắc chắn lắm :frowning:

1 Like

Đọc bài mà @Sherly1001 đưa chưa? Trong đó giải thích đủ rồi.

2 Likes

trong mùa dịch 1 số gv của các trường đại học dạy phần này trên ytb này

nếu xem của các thầy cô dạy thì có lẽ sẽ hơn là bạn tự đọc

1 Like

Ủa cái bài này ở đâu mà nhiều bạn hỏi giống nhau vậy ta? :smiley:

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