2011-05-24 44 views
7

a là mảng số nguyên, nếu tôi cố gắng trừ giá trị địa chỉ của &a[2] - &a[1] == ? kết quả sẽ là 4 hoặc 1?C++: & a [2] - & a [1] ==?

EDIT: xem nhận xét thứ 4 về câu trả lời hàng đầu here lý do tại sao anh ấy nói 1 ?? đây là lý do tại sao tôi đang bối rối Tôi nghĩ rằng nó sẽ là 4

EDIT: đây là một test

+5

bạn sẽ nhận được gì khi chạy nó? –

+3

@disioe : bạn không có trình biên dịch? Vậy tại sao bạn viết mã? –

+0

@ Mì lúa mì: Tôi không phải là tôi không thể ngủ, vì vậy tôi đang đọc stackoverflow :)) Tôi lập trình bằng C# cho tiền. Nhưng thực ra tôi sẽ thử nó trên codepad.org nhưng bây giờ nó không hoạt động nên tôi quyết định hỏi – disioe

Trả lời

9

&a[2] là giống như &(*(a + 2)) (nghĩa là (a + 2)) và &a[1] là giống như &(*(a + 1)) (ví dụ: (a + 1)). Vì vậy, câu trả lời sẽ là 1.

+0

Cảm ơn bạn rất nhiều, tôi nhận được nó ngay bây giờ. Đó là trong chủ đề tôi đọc quá nhưng bằng cách nào đó tôi đã không nhận được nó. Cảm ơn một lần nữa vì sự giúp đỡ của bạn. – disioe

+0

Không có vấn đề @disioe. –

6

Pointer trừ mang đến cho bạn sự khác biệt trong yếu tố, không byte. Không quan trọng loại phần tử của mảng là gì, kết quả của &a[2] - &a[1] sẽ luôn là 1, vì chúng cách nhau 1 phần tử.

3

Sự khác biệt phải là 1. Khi bạn so sánh con trỏ, bạn sẽ luôn nhận được sự khác biệt của các phần tử.

4

Luôn luôn 1. Điểm số con trỏ không quan tâm đến số byte mà mỗi phần tử có, và điều này rất hữu ích. So sánh các:

ptr++; // go to the next element (correct) 
ptr += sizeof *ptr; // go to the next element (wrong) 

Khi bạn làm việc với mảng bạn thường quan tâm đến các yếu tố , không phải trong byte bao gồm họ, và đó là lý do tại sao arithmetics con trỏ trong C đã được định nghĩa theo cách này.

2

Vì đây là C++, tôi sẽ giả định rằng bạn đã không ghi đè các toán tử & hoặc * trên bất kỳ loại a nào. Minding rằng, sau đây là đúng:

&a[2] - &a[1] 
(a + 2) - (a + 1) 
a + 2 - a - 1 
2 - 1 
1 
+1

Nguồn gốc tuyệt vời. – harper

1

Một vài câu trả lời ở đây (xóa từ câu trả lời này đã được đăng) đã rõ ràng byte * trong tâm trí:

int a[10]; 
    byte * pA2 = (byte*)&a[2]; 
    byte * pA1 = (byte*)&a[1]; 
    int sz1 = &a[2] - &a[1]; 
    int sz2 = pA2 - pA1; 
    CString msg; 
    msg.Format("int * %d, byte * %d\n", sz1, sz2); 
    OutputDebugString(msg); 

đầu ra là:

 int * 1, byte * 4 

Hai địa chỉ nhưng tùy thuộc vào việc khai báo biến địa chỉ được lưu trữ, sự khác biệt giữa hai địa chỉ có thể là 1 hoặc 4.

+1

Đó là vấn đề của tôi, vì câu hỏi không có trong mã, tôi đọc câu hỏi vì sự khác nhau giữa hai địa chỉ là gì, chứ không phải về "số học con trỏ". – Jens

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