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: 
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`.
```
arr+1

```

Here arr is base pointer to integer array so results in incremented by `sizeof(int)`

```
&arr+1

```

Here `&arr` results in address of array so result is incremented by array size.