2012-07-15 19 views

Trả lời

6

Dễ dụ: đối xử với các bộ nhớ như một mảng của char unsigned

void *memory = malloc(1000); //allocate a pool of memory 
uint8_t *ptr = memory+10; 
*ptr = 1 //set an integer value at byte 10 
uint8_t i = *ptr; //read an integer value from the 10th byte 

Bạn có thể sử dụng số nguyên quá, nhưng sau đó bạn phải chú ý về số lượng byte bạn đang thiết cùng một lúc.

+0

Có thể thực hiện điều này bằng cách truyền con trỏ trống thay vì tạo con trỏ đã nhập "trung gian" không? – dtech

+0

tất nhiên, tôi sử dụng biểu diễn trung gian vì mục đích rõ ràng – ziu

3

Vì vậy, bằng cách "làm việc" Tôi giả sử bạn có nghĩa là "làm thế nào để dereference/thực hiện con trỏ số học trên void*"? Bạn không thể; bạn phải đúc nó, thường là một char* nếu bạn chỉ quan tâm đến việc đọc các khối bộ nhớ. Tất nhiên, nếu đó là trường hợp, chỉ cần khai báo nó như là một char* để bắt đầu.

+0

Tôi quan tâm đến việc đọc/viết bất kỳ loại nào, không chỉ char. – dtech

+0

@ddriver: Điều đó không thay đổi gì cả. Bạn phải bỏ con trỏ. Làm thế nào bạn mong đợi một dereference và/hoặc số học để hành động khi loại không rõ? Không có nghĩa lý gì. Bạn sẽ cần phải chuyển thông tin bổ sung để biết loại cơ bản là gì. –

4

Các quy tắc rất đơn giản:

  • tất cả các loại con trỏ (trừ con trỏ chức năng) có thể được đúc đến và đi từ void *, mà không mất.
  • bạn không thể thực hiện số học con trỏ trên con trỏ void * và không thể bỏ qua chúng
  • sizeof (char) bằng 1, theo định nghĩa; do đó tăng một con trỏ char có nghĩa là "thêm 1" vào giá trị con trỏ "thô"

Từ đây bạn có thể kết luận rằng nếu bạn muốn thực hiện số học con trỏ "thô" bạn phải truyền đến và từ char *.

Các vấn đề liên quan