Question: ```
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%p,%p\n", arr, &arr);
printf("%p,%p\n", arr+1, &arr+1);
return 0;

```

For this code, GCC compiler return 

```
0xbfe41348,0xbfe41348
0xbfe4134c,0xbfe41370

```

The first line is clear, no problem. But the second line makes me confused. The first address moves to the next `int`, so it is 4 bytes after `arr`, clear. However, for **`&arr+1`** I thought it will point to the end of the whole array `arr[10]`, so it should add **4\*10** to the address. Do I misunderstand something?

Answer: 
What you think is right and it is done that way only.

Since `&arr` => `0xbfe41348` and

`0xbfe41348` + `0x28`(`4*10` in decimal) = `0xbfe41370`

I think you got confused due to addition of decimal to a hexadecimal number.
The type of `&arr` is 'pointer to array of 10 `int`'. Therefore, when you add one to it (`&arr+1`), it moves to the start of the next array of 10 `int`, which is 40 bytes beyond the start of `&arr`.