Câu hỏi đơn giản là tốt, tôi nghĩ rằng nó được thiết lập tốt cho tất cả các cấp, không chỉ là một tầng lớp.
Không có null
trong C (trừ khi bạn tự xác định). Khởi tạo một con trỏ null có thể được thực hiện theo một trong hai cách sau đây:
int *p = 0;
int *p = NULL;
Nếu bạn dereference p
sau đó, bạn đang có khả năng để có được một vi phạm truy cập (Tôi tin rằng đó là hành vi không xác định theo tiêu chuẩn, thực sự, bất cứ điều gì có thể xảy ra, lên đến và bao gồm, hủy diệt toàn bộ vũ trụ - nó thậm chí có thể tiếp tục chạy tốt, nhưng tôi sẽ không dựa vào nó).
Để có được một con trỏ đến một số nguyên thực tế, chỉ cần sử dụng:
int a = 7;
int *p = &a;
sử dụng địa chỉ-của nhà điều hành.
Chỉnh sửa, không lạ chút nào, bạn chỉ cần hình dung nó. Giả sử tất cả các biến được tạo bắt đầu từ vị trí bộ nhớ 100 và số nguyên và con trỏ đều dài 4 byte. Phá vỡ hai tình huống của bạn xuống đến hình thức đơn giản nhất của họ:
int x = 2;
int *px = 0; int *px = &x;
+-----+ +-----+
px(100): | 0 | x(100) | 2 |
+-----+ +-----+
px(104) | 100 |
+-----+
Sau đó, bạn thực hiện lệnh
*px = 7;
trong một nỗ lực để thay đổi biến được trỏ đến bởi px
.
Ở phía bên tay trái, bạn sẽ cố gắng ghi giá trị 7 vào vị trí bộ nhớ 0.Đó là một điều xấu; rất ít hệ thống sẽ cho phép bạn làm điều đó mà không bị rơi, thậm chí ít hơn sẽ cho phép nó mà không có bất kỳ tác động bất lợi nào (một số phiên bản của HP-UX thực sự hoạt động tốt).
Ở bên phải là những gì nên xảy ra. Giá trị được chọn từ px
là 100, vì vậy giá trị 7 được ghi vào vị trí bộ nhớ đó, thay đổi x
như dự định.
Tôi thường tìm thấy hình ảnh (ngay cả những tác phẩm nghệ thuật ASCII nguyên thủy, vì tôi không có Rubens hoặc Botticelli) giúp làm rõ các khái niệm. Hy vọng rằng nó xóa nó lên một chút cho bạn.
Bạn đang gặp sự cố vì int * tmpPtr = 0; là một con trỏ NULL và không trỏ vào một phân đoạn bộ nhớ có chứa một int. Về cơ bản, bạn đang nói con trỏ này trỏ vào không có gì và bạn không thể sao chép các số nguyên chiếm không gian bộ nhớ thành thứ không có dấu cách. int * tmpPtr = &tmp; Đang gán ADDRESS của bộ nhớ bị chiếm bởi tmp vào con trỏ của bạn. Ở đây bạn đang nói rằng con trỏ trỏ vào bộ nhớ được cấp phát cho tmp. Bây giờ, Sao chép thực sự có thể sao chép dữ liệu vào không gian đó bởi vì con trỏ của bạn đang trỏ vào thứ gì đó mà nó có thể sử dụng. –
Vâng, điều đó khiến cho cảm giác thật tuyệt vời! Cám ơn vì đã giải thích! –