C++: Массивы, указатели, циклы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Ru}{eeZ, 11 Feb 2011.

  1. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Code:
    int a[] = {5, 4, 9};
    
    for(int *b = a, *c = b + 3; b != c; ++b)
    cout << *b << endl;
    
    ruxeez@ruxeezpc:~$ ./a.out
    5
    4
    9
    ruxeez@ruxeezpc:~$ 
    Code:
    int a[] = {5, 4, 9};
    
    for(int *b = a; b != b + 3; ++b)
    cout << *b << endl;
    
    ruxeez@ruxeezpc:~$ ./a.out
    ...
    1701670766
    1919251501
    1634625901
    1029636204
    778121006
    7632239
    778121006
    7632239
    0
    Ошибка сегментирования
    ruxeez@ruxeezpc:~$ 
    Почему первый вариант работает правильно, а второй - нет?
     
    1 person likes this.
  2. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Gar|k подсказал: каждый раз идёт сравнивание значения с суммой, в которой "b" так же меняется, т.е. с каждым инкрементом сумма, с которой мы сравниваем, увеличивается.

    Изменил на:
    Code:
    	int a[] = {5, 4, 9};
    
    	for(int *b = a; b != a + 3; ++b)
    		cout << *b << endl;
    
     
  3. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Так нам же и нужно сравнивать адреса, а не значения из памяти. Прочитай выше моё второе сообщение.
     
  4. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Не могу удержаться, такого я давно не видел. XD
    У вас в условии цикла левый операнд ВСЕГДА больше правого на 3*sizeof(int).
    Как я догадался? Подскажет КЭП.
     
  5. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    wolmer
    Ещё более жжёт!!! * означает операцию разыменования. Но цикл остановится например в таком случае.
    {2,3,4,5,3}
    И доблестно программа выведет 2.
     
  6. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    irdis, да знаю, поторопился :)
     
  7. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    int *x;
    здесь это объявление указателя...
    ребята это пиздец, а не тред.
    :D :D :D :D :D :D :D
     
    #7 Irdis, 11 Feb 2011
    Last edited: 11 Feb 2011
  8. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    бес шуток прекращайте нести...
    объявляется указатель b которому присваевается указатель а.
    равносильно
    int * b;
    b=a;
    а указывает на первый элемент массива a
     
    #8 Irdis, 11 Feb 2011
    Last edited: 11 Feb 2011
  9. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    Ru}{eeZ
    Попробуй передать в функцию указатель на двухмерный массив
    и там в функции в цикле его повыводить
    :)

    Так, для практики
     
  10. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    кстати,пользуясь моментом, взять элемент можно и так
    0[a]
    1[a]
    ...
    i[a]
     
    #10 Irdis, 11 Feb 2011
    Last edited: 11 Feb 2011
  11. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Я гребу... Вы берёте адрес указателя. и пытаетесь присвоить указателю.
    Мы с компилятором сходимся в мнении
    Error 1 error C2440: 'initializing' : cannot convert from 'int (*)[3]' to 'int *' c:\projects\z24\z24\z24.cpp 13 z24
     
  12. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    Народ, скажите
    а можно ли в С++
    создать и использовать ассоциативные массивы прям как в php ?
     
  13. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    ЭТО ПРОСТО АД!!!!!!!!!!!!
    rudi меня порвало
    В с++ лучше ничего не использовать как в пхп!
     
  14. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Нет, так как у этих языков в корне различный вид типизации(динамика vs статика).
     
  15. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Не спутал.
    3["string"] то же самое, что "string"[3]
     
    2 people like this.
  16. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Можно, если найти или написать соответствующий класс, только это будут не массивы, а разновидность контейнеров.

    Irdis, ты по-моему перевозбуждён)
     
  17. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    в данном случае не адрес указателя а адрес массива
    (указатель на массив)
    тоесть указатель на первый элемент не генерируется
    если "имя массива"
    является операндом унарного оператора &, или операндом операций ++, --, sizeof, или левым операндом присваивания, или операндом оператора . (точка).
     
    1 person likes this.
  18. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Подскажите ещё с итераторами.

    Так работает нормально:
    Code:
    vector<int> a;
    a.push_back(4);
    a.push_back(3);
    a.push_back(7);
    a.push_back(446);
    a.push_back(1);
    a.push_back(0); int b = 0;
    
    for(vector<int>::iterator iter = a.begin(); iter != a.end(); ++iter, ++b)
    {b % 2 != 0 ? *iter *= 2 : 0; cout << *iter << endl;}
    
    А так нет:
    Code:
    vector<int> a;
    a.push_back(4);
    a.push_back(3);
    a.push_back(7);
    a.push_back(446);
    a.push_back(1);
    a.push_back(0); int b = 0;
    
    for(vector<int>::iterator iter = a.begin(); iter != a.end(); ++iter, ++b)
    	b % 2 != 0 ? cout << *iter *= 2 << endl : 0;
    
    
    ruxeez@ruxeezpc:~$ g++ '/home/whitezoron/Рабочий стол/Proging/Стэнли Липман/x.9.cpp'
    /home/whitezoron/Рабочий стол/Proging/Стэнли Липман/x.9.cpp: In function ‘int main()’:
    /home/whitezoron/Рабочий стол/Proging/Стэнли Липман/x.9.cpp:26: error: invalid operands of types ‘int’ and ‘<unresolved overloaded function type>’ to binary ‘operator<<’
    ruxeez@ruxeezpc:~$ 
    
    Как сделать, чтобы второй вариант работал? Расставить приоритеты?
     
  19. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    b % 2 != 0 ? cout << (*iter *= 2) << endl : (void*)NULL;
     
  20. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Не только в приоритетах дело.
    Но и
    c?a:b;
    must
    typeof(a) == typeof(b)
    далее читирим c помощью типа void*.
     
    1 person likes this.