Hỏi về đoạn code có sử dụng con trỏ

Mình xem youtube có một câu hỏi này mà chưa trả lời đươc , mọi người chỉ giáo và giải thích với ạ!

Câu hỏi đâu bạn ey ?
Dòng 3:
Khai báo 3 biến int. Mỗi biến chiếm 4 byte liên tiếp trên bộ nhớ và nằm bắt đầu từ địa chỉ PA, PB, PC. A có giá trị = 5, b giá trị bằng 10 và riêng c không xác định được giá trị.

Dòng 4:
Khai báo 2 con trỏ trỏ tới a và b. Sau các phép lấy địa chỉ và gán ta có giá trị chứa trong 2 con trỏ là pa = PA và pb = PB.

Dòng 5:
c là hiệu của phép trừ 2 con trỏ. Nó sẽ có giá trị = PB-PA. Hiệu này cho biết khoảng cách giữa 2 vùng nhớ của a và b là bao nhiêu phần tử.
Theo cách khai báo liên tiếp a,b như trên thì khả năng lớn vùng nhớ của b nằm ngay sau vùng nhớ của a nên c sẽ có giá trị = 1.
Khi test toàn ra -1.

3 Likes

à Nhưng theo người ra đề thì kết quả c = 4 hoặc c = 8 đều sai ạ :frowning:

Ở đây, phép toán trên con trỏ là theo khoảng cách dữ liệu chứ không theo số byte nha.
Ví dụ

char c[2];
int arr[2];
// Thì cả &c[1]-&c[0] và &arr[1]-&arr[0]
// đều có kết quả là 1 nhé

Nên trong kết quả ở đây sẽ không phụ thuộc vào sizeof(int)
Tuy nhiên, không có quy định nào về việc các biến a, b trên kia sẽ được cấp phát liên tục và đúng như thứ tự đã khai báo cả. Nên đáp án đúng nhất là không thể biết hoặc tùy theo implementation của compiler
Còn chày cối muốn coi compiler nó ra bao nhiêu thì cứ chạy thử thôi, khả năng cao là -1 hoặc 1

4 Likes

Kết quả là 1 ạ , a có thể giải thích kỹ hơn được k ạ

Mình đã giải thích rất rõ ở trên rồi. Bạn đọc lại và suy ngẫm kỹ từng câu từng chữ nha.

3 Likes

Mình hiểu là a b cách nhau 4 byte thì pb - pa = 4/sizeof(int) = 1. Nhưng mà mình chạy trên visual studio thì kết quả lại ra 8 mong bạn giải thích giúp mình chỗ này.

Bạn đọc lại đoạn này đi

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