2012-08-08 28 views
5

tôi có một chương trình về 2-D mảngXin giải thích sự khác biệt

cơ sở địa chỉ là 8678

#include<stdio.h> 
#include<conio.h> 
main() 
{ 
int arr[3][3]={ 
       {83,8,43}, 
       {73,45,6}, 
       {34,67,9} 
       }; 
printf("%d ",&arr+1); //points to 8696 
printf("%d ",arr+1); //points to 8684 
return 0; 
} 

sự khác biệt giữa arr+1&arr+1 là gì?

Trả lời

9

Vâng, chúng là những thứ khác nhau. arr phân rã trong hầu hết các ngữ cảnh đối với một con trỏ đến phần tử đầu tiên trong mảng của bạn - điều đó có nghĩa là một con trỏ đến hàng 3 phần tử đầu tiên trong mảng 2D của bạn: loại int (*)[3]. arr + 1, sau đó, trỏ tới hàng thứ hai trong mảng.

&arr là địa chỉ của chính mảng đó (loại int (*)[3][3]), vì vậy &arr + 1 chỉ vào bộ nhớ vừa qua cuối toàn bộ mảng 2D của bạn.

Bạn có thể xác nhận hành vi này dễ dàng bằng cách in khác nhau. Cụ thể, in offset cho các con trỏ mới hơn là các giá trị tự nó sẽ giúp mọi thứ rõ ràng. Kết quả của chương trình của bạn từ các báo cáo in:

printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr); 
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr); 

Sẽ là offsets thập phân để &arr+1arr+1 tương ứng. Dưới đây là kết quả từ một chạy thử tôi chỉ cần thực hiện:

36 
12 

36 trận đấu lên: 3 hàng x 3 cột × 4 byte cho mỗi entry = 36 byte. Vì vậy, hàng 12: 1 × 3 cột × 4 byte cho mỗi mục = 12 byte.

Lưu ý - bạn cũng đang in con trỏ bằng cách sử dụng %d, điều này là sai. Có thể bạn đang sử dụng %p cho điều đó.

+2

tôi đã học được rất nhiều từ câu trả lời của bạn. Cảm ơn. –

+0

Với '% p', bạn cần truyền các con trỏ tới' void * '. –

1

Bạn có thể con số này ra với sự giúp đỡ tương đương này: X [Y] === * (X + Y)

Kể từ * (arr + 1) === arr [1], arr + 1 === & arr [1]

Tương tự, & arr + 1 === & ((& arr) [1])

(& arr) là gì [1]? Vâng, (& arr) [0] === * & arr === arr, tức là, mảng 3x3, vì vậy (& arr) [1] là mảng 3x3 sau đó, và & arr + 1 === & ((& arr) [1]) là địa chỉ của mảng 3x3 sau & arr ... một con trỏ tới byte vừa qua toàn bộ mảng.

-1

mảng + 1 nghĩa là địa chỉ của mảng [1] và chi phí là 3 bộ nhớ int.

& mảng + 1 nghĩa là địa chỉ của mảng [0] thêm 1;

+0

Sai. Hãy thử nó và bạn sẽ thấy. Hoặc thậm chí chỉ cần nhìn vào đầu ra của OP, tôi đoán vậy. –

+0

Tiếng Anh hồ bơi khiến bạn hiểu lầm tôi. mảng là một con trỏ trỏ đến địa chỉ của mảng, và (mảng + 1) là một con trỏ trỏ đến địa chỉ của mảng [1]. & mảng là địa chỉ của mảng và sau đó thêm 1. – hupantingxue

+0

Carl Norum, bạn hiểu lầm tôi. – hupantingxue

0

Giờ đến + 1 cung cấp cho các phần tử tiếp theo trong một mảng trong khi & arr +1 mang lại cho địa chỉ của mảng tiếp theo của số nguyên

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