C++ - Tutorial 005. Pointers, Arrays and Loops

C++, pointer, arrays, loops

An array of elements of type char can be declared like this:

char v[6];  // array of 6 characters

Similarly, a pointer can be declared like this:

char* p; // pointer to character

In declarations, [] means ‘‘array of’’ and *means ‘‘pointer to.’’ All arrays have0as their lower bound, so v has six elements, v[0] to v[5] . The size of an array must be a constant expression. A pointer variable can hold the address of an object of the appropriate type:

char∗ p = &v[3]; // p указывает на четвёртый элемент массива v
char x = ∗p; // *p является объектом, на который указывает p

In an expression, prefix unary ∗ means ‘‘contents of’’ and prefix unary & means ‘‘address of.’’ We can represent the result of that initialized definition graphically:

Consider copying ten elements from one array to another:

void copy_fct()
{
    int v1[10] = {0,1,2,3,4,5,6,7,8,9};
    int v2[10];  // to become a copy of v1

    for (auto i=0; i!=10; ++i) // copy elements
        v2[i]=v1[i];
}

This for -statement can be read as ‘‘set i to zero; while i is not 10 , copy the i th element and increment i.’’ When applied to an integer variable, the increment operator, ++ , simply adds 1 . C++11 also offers a simpler for -statement, called a range-for-statement, for loops that traverse a sequence in the simplest way:

void print()
{
    int v[] = {0,1,2,3,4,5,6,7,8,9};
    for (auto x : v)
        cout << x << '\n'; // for each x in v

    for (auto x : {10,21,32,43,54,65})
        cout << x << '\n';
}

The first range-for-statement can be read as ‘‘for every element of v , from the first to the last, place a copy in x and print it.’’ Note that we don’t hav e to specify an array bound when we initialize it with a list. The range-for-statement can be used for any sequence of elements.

If we didn’t want to copy the values from v into the variable x, but rather just have x refer to an element, we could write:

void increment()
{
    int v[] = {0,1,2,3,4,5,6,7,8,9};
    for (auto& x : v)
        ++x;
}

In a declaration, the unary suffix & means ‘‘reference to.’’ A reference is similar to a pointer, except that you don’t need to use a prefix * to access the value referred to by the reference.

T a[n];  // array of n Ts
T∗ p;    // pointer to T
T& r;    // reference to T
T f(A);  // function taking an argument of type A returning a result of type T

We try to ensure that a pointer always points to an object, so that dereferencing it is valid. When we don’t hav e an object to point to or if we need to represent the notion of ‘‘no object available’’ (e.g., for an end of a list), we give the pointer the value nullptr (‘‘the null pointer’’). There is only one nullptr shared by all pointer types:

double∗ pd = nullptr;
Link<Record>∗ lst = nullptr; // pointer to a Link to a Record
int x = nullptr; // error : nullptr is a pointer not an integer

It is often wise to check that a pointer argument that is supposed to point to something, actually points to something:

int count_x(char∗ p, char x)
    // count the number of occurrences of x in p[]
    // p is assumed to point to a zero-ter minated array of char (or to nothing)
{
    if (p==nullptr) return 0;
    int count = 0;
    for (; ∗p!=0; ++p)
        if (∗p==x)
            ++count;
    return count;
}

Note how we can move a pointer to point to the next element of an array using ++ and that we can leave out the initializer in a for-statement if we don’t need it.

In older code, 0 or NULL is typically used instead of nullptr. However, using nullptr eliminates potential confusion between integers (such as 0 or NULL ) and pointers (such as nullptr ).

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

VL
Jan. 20, 2020, 12:42 p.m.
Vova Lebedev

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
VL
Jan. 20, 2020, 12:33 p.m.
Vova Lebedev

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating points4
AP
Jan. 20, 2020, 5:48 a.m.
Anastassiya Polyakova

C++ - Тест 003. Условия и циклы

  • Result:57points,
  • Rating points-2
Last comments
Jan. 17, 2020, 2:31 a.m.
Andrej Jankovich

Выглядит как ошибка библиотеки. Расскажите подробно на какой платформе вы собираете проект (MinGW или MSVC) их версии и версии Qt.
D
Jan. 16, 2020, 12:06 p.m.
DENIZ1819

Доброго времени суток, не подскажите, что делать в данной ситуации, после того, как я сделал все вышеуказанные инструкции для подключения библиотеки к проекту?
Jan. 14, 2020, 5:33 a.m.
Evgenij Legotskoj

Рекомендую Wt, достаточно мощная вещь. Этот фреймворк может использоваться для написания сайтов на C++, либо можно использовать только отдельный компоненты, например только ORM. Но я не знаю, ка…
a
Jan. 14, 2020, 5:29 a.m.
ayb

Спасибо за инфу. Поиск качественной ORM привел меня только к sqlite_orm, но не подходит из-за необходимости полноценной поддержки c++14. Про framework Wt не слышал, спасибо за наводку.
Jan. 14, 2020, 2:50 a.m.
Evgenij Legotskoj

Вы заблуждаетесь. Любая нормальная ORM позволяет выполнение сырых SQL запросов. А если хорошо разобраться в работе моделей данных в Qt, то не составит труда использовать ORM вместе с Qt, ту же с…
Now discuss on the forum
VZ
Jan. 20, 2020, 2:37 p.m.
Vladimir Zhitkovsky

Еще не очевидное поведение оказалось, что сигнал onVisibleChanged родительского элемента может вызваться раньше, чем вызовуться onCompleted дочерних компонентов.. как мне очень странно. А вот на…
Jan. 20, 2020, 1:49 p.m.
Evgenij Legotskoj

Добрый день, Касательно удаления строк. Любой QTableView класс, или наследованый от него имеет метод selectionModel() , который возвращает QItemSelectionModel . А эта…
Jan. 20, 2020, 1:38 p.m.
Evgenij Legotskoj

Добрый день, Я не работал с iOS, поэтому могу только догадываться, не может ли быть проблема в самом url? То есть не может ли быть какой-то другой путь в Qt, а не file:assets-lib…
Jan. 20, 2020, 1:35 p.m.
Evgenij Legotskoj

Добрый день. В Qt по сути используется MV шаблон проектирования. Поскольку контроллер и представление объединены в представлении. Так что да, вы понимаете правильно суть Qt. Насчёт тормозов…
m
Jan. 20, 2020, 11:14 a.m.
mihamuz

Совершенно верно. Только увидел Ваше сообщение:)
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB