[C++] Array

 

Access the elements of an Array

    unsinged scores = {1, 2, 3, 4, 5, 6};
    for ( auto i:scores){
        cout << i << " ";
    }
    cout << endl;

Becuase the dimension is part of each array type. the system know how many elements are in scores.

 

Pointers and Arrays

In C++, pointers and array are closely intertwined. When we use an array, the compiler ordinarily convert the array to a pointer.

    string nums[] = {"one", "two", "three"};
    string *p = &nums[0];    // p points to the first element in nums

Arrays have a special property - in most places when we use an array, the comipler automatically substitutes a pointer to the first element.

    string *p2 = nums;    // equivalent to p2 = &nums[0]

In most expression, when we use an object of array type, we are really using a pointer to the first element in the array. 

When we use an array as an initializer for a variable defined as auto, the deduced type is a pointer, not an array:

    int ia[] = {0, 1, 2, 3, 4, 5};
    auto ia2(ia);    //    ia is an int * that points to the first element in ia

which is equivalent to 

    auso ia2(&ia[0]);

 

Pointer in arrays have additional operations beyond basic pointers. Pointers to array elements support the same operations as iterators on vectors or strings.

    int arr[] = {0, 2, 4, 6, 8};
    int *p = arr;    // p points to the first elemnt in arr
    ++p;        // p points to arr[1]

 

When we add (or substract) an integral value to(or from) a pointer, the result is a new pointer. The new pointer points to the element the given number ahead the original pointer.

    int arr[5] = {1, 2, 3, 4, 5};
    int *p = arr;    // equivalent to int *p = &arr[1]
    int *ip2 = p + 4;    // ip2 points to arr[4], the last element in arr

 

Interaction between Dereference and Pointer Arithmetic

    int ia[] = {0, 2, 4, 6, 8};
    int last = *(ia + 4);    // ok; initilize last to 8, the value of ia[4]

The expression*(ia + 4) calculate the address four elements past ia and dereference the resulting pointer. This expression is equivalent to writing ia[4].

    last = *ia + 4;    // ok; last 4. equivalent to ia[0] + 4

 

Subscripts and Pointers

When we substripts an array, we are really subscripting a pointer to an element in that array.

    int i = ia[2];    // ia is converted to a pointer to the first element in ia.
                      // ia[2] fetchs the elements to which (ia + 2) points
    int *p = ia;      // p points to the first element in ia;
    i = *(p + 2)      // equivalent to ia[2]
    int *p = &ia[2];    // p points to the element indexed by 2
    int j = p[1];       // p[1] is equivalent to *(p + 1). 
                        // p[1] is the same element as ia[3]
    int k = p[-2];      // p[-2] is the same element as ia[0]

The library types force the index used with a subscript to be an unsigned value. The built-in subscript operator does not. The index used with the built-in subscript operator can be negatie value.

 

C-style stirngs are not  type. Instead, they are a convention for how to represent and use character strings. Strings that follow convertion are stored in character arrays and are null terminated('\0').

Although C++ supports C-style strings, they should not be used by C++ programs. C-style strings are a surpringly rich source of bus and are the root cause of many security problems.

The pointer passed to these routins must point to null-terminated arrays.

    char ca[] = {'C', '+', '+'};    // not null-terminated
    cout << strlen(ca) << endl;    // disaster; ca isn't null-terminated

In this case, ca is an array of char but is not null-terminated. The result is undefined. The most likely effect of this call is that strlen will keep looking through the memory that follows ca until it encounter a null character.

For most application, in additions to being safter, it is also more efficient to use library strings rather then C-style strings.

 

Mixing library strings and C-style strings

    string s("hello world");
    char *str = s;                // error, cannot initialize a char * from a string
    const char *str = s.c_str();    // ok

If a program need continue uses the content of the array returned by c_str(); the program must copy the array return by c_str();

We cannot initilize a built-in array from another array. Nor can we initliaze an array from vector. However, we can use an array to initliaze a vector.

    int int_arr[] = {1, 2, 3, 4, 5};
    vector<int> ivect(begin(int_arr), end(int_arr));

 

Pointers and arrays are surprisingly error-prone.

Modern C++ programs should use vectors and iteractor instead of built-in arrays and pointers. and use strings rather then C-style based character strings.

 

Reference:

C++ Primer, Fifth Edition, 3.5. Arrays

posted @ 2017-02-23 23:29  TonyYPZhang  阅读(315)  评论(0编辑  收藏  举报