TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
 Specialized Dev Zones Research Center eBook Library .NET Java C++ Web Dev Architecture Database Security Open Source Enterprise Mobile Special Reports 10-Minute Solutions DevXtra Blogs Slideshow

 Home » Tip Bank » C++ » Pointer Arithmetic
Language: C++
Expertise: Intermediate
Jul 9, 1999

### WEBINAR:On-Demand

Building the Right Environment to Support AI, Machine Learning and Deep Learning

# Constraints on Pointer Arithmetic Past an Array's End

In Standard C and C++, the address of the first element past the end of an array can be used in pointer arithmetic. Thus, you can initialize a vector with the contents of a built-in array, like this:

``````
int arr[3] = {1, 2, 3};
vector <int> vi ( arr,          //address of  the array's beginning
arr + 3 );  // address of one element past the array's end
``````

Now consider an almost identical version of this example:

``````
vector <int> vi ( &arr[0],     //address of  the array's beginning
&arr[3] );   // address of one element past the array's end
``````

Both forms seem to be correct and identical but they are not. While the Standard allows you to take the address of one element past the array's end (as shown in the first example), the second example does something different. To understand the difference, it is important to know how precisely the expression &arr[3] is interpreted. First, the subexpression arr[3] is evaluated to *(arr+3), that is, the element located one position past the array's end is read. However, no such element exists. Next, the address of the non-existent element is taken. In other words, &arr[3] is equivalent to &(*(arr+3)), which is very different from arr+3. The first example is legal, while the other is undefined (although in practice, it will work on most compilers as expected).

Most experienced C and C++ programmers are surprised that &arr[3] isn't completely equivalent to arr+3. In fact, it even surprised the C committee, who heard about the issue only recently. Hopefully, this loophole will be fixed in the upcoming revision of the C standard.

Danny Kalev

 Submit a Tip Browse "C++" Tips Browse All Tips
Comment and Contribute

(Maximum characters: 1200). You have 1200 characters left.

Thanks for your registration, follow us on our social networks to keep up-to-date