int main()
{
long a[10];
void *ptr1 = &a[7], *ptr2 = &a[1];
// long d0 = ptr1 - ptr2; Lỗi do tính hiệu số hai con trỏ kiểu void không biết kích thước
long d1 = (long*)ptr1 - (long*)ptr2;
long d2 = (char*)ptr1 - (char*)ptr2;
long d3 = (short*)ptr1 - (short*)ptr2;
printf("\nd1 = %ld", d1);
printf("\nd2 = %ld", d2);
printf("\nd3 = %ld", d3);
printf("\nDistance = %ld", (long)ptr1 - (long)ptr2);
// long d4 = (long*)ptr1 - (char*)ptr2 // Lỗi vì tính hiệu số hai con trỏ khác kiểu
// long d5 = (long*)ptr1 - (float*)ptr2 // Lỗi vì tính hiệu số hai con trỏ khác kiểu
getch();
return 0;
}
Thứ Hai, 4 tháng 1, 2016
- tháng 1 04, 2016
- Nguyễn Văn Tiềm
- C Programing, Pointer, Programing
- No comments
Đoạn chương trình minh họa về việc tính hiệu của hai con trỏ đang lưu địa chỉ bộ nhớ. Trước tiên là các dòng mã đang bị chú thích, nếu gỡ bỏ việc ghi chú thì sẽ bị lỗi biên dịch. Khi chạy chương trình thì kết quả in ra là d1 = 6, d2 = 24, d3 = 12, Distance = 24. Trong đó giá trị d2 và Distance là 24 chính là độ lệch tính bằng byte của địa chỉ bộ nhớ do cách tính toán ở các dòng "ép kiểu sang char*" và "ép kiểu thô bạo thành số nguyên long". Bởi vì ptr1 giữ địa chỉ &a[7] và ptr2 giữ địa chỉ &a[1] nên độ lệch địa chỉ tính bằng byte giữa ptr1 và ptr2 là d2 = (7 - 1) x sizeof(long) = 6 x 4 = 24 byte. Giá trị d1 là 6 vì lý do là d1 = 24/sizeof(long) = 24/4 = 6. Giá trị d3 = 12 vì lý do d3 = 24/sizeof(short) = 24/2 = 12.
Đăng ký:
Đăng Nhận xét (Atom)
0 nhận xét:
Đăng nhận xét