Вопрос новичка по массиву C

#c #arrays

#c #массивы

Вопрос:

Я работаю с демонстрационной программой, написанной кем-то другим, и я очень смущен некоторыми инструкциями, которые они используют. Я не очень хорошо знаком с C (особенно с Obj-C), и я не уверен, является ли это допустимым кодом или нет. Возьмем, к примеру, следующее: (комментарии мои)

 int main(int argv, char** argc)
{
    int perm [20]; //OK, so declare an array of ints, size = 20
    for (int i=0; i < 20; i  )
        perm = i; //whaaaaa??? thought you need to specify an element to assign to an array...
}
  

Это один из примеров — мой компилятор выдает ошибку «несовместимые типы при присвоении ‘int’ значению ‘int [20]», но, по-видимому, другие смогли скомпилировать программу. Я спятил, или это плохой код?

Вот еще одна часть, которую я просто не понимаю:

 int d[20] = {0}; //OK, another int array of size 20, initialized to 0's
for (int i = 1; i < n; i  )
{
    d = d[i - 1]; //this I don't get - assign the array to one of its own elements??
    if (invperm[i - 1] < b)
        d  ;  //this would just increment to the next element? 
}
  

Я подозреваю, что ошибка связана с пониманием с моей стороны, как если бы код был плохим, другие люди прокомментировали бы этот факт … если у кого-нибудь есть хорошее объяснение и / или ресурс, который я могу прочитать, чтобы понять это, я был бы очень признателен!

Спасибо!

* ОТРЕДАКТИРОВАНО Для ДОБАВЛЕНИЯ*

В ответ на приведенные ниже ответы я скопировал / вставил этот код, и для меня он выглядит неповрежденным…Я могу только предположить, что когда оригинальный автор опубликовал его, он каким-то образом исказил его. Спасибо за ответы, я рад, что у меня было правильное понимание, и я попытаюсь связаться с автором, чтобы узнать, есть ли где-нибудь неповрежденная копия!

Комментарии:

1. Откуда, черт возьми, вы это взяли? Это прямое копирование и вставка?

Ответ №1:

Все эти примеры абсолютно неверны. Похоже, вы проиграли [i] , когда скопировали код оттуда, откуда вы его взяли.

Я видел нечто подобное с кодом, отправляемым через программы Messenger, которые обрабатывают определенные фрагменты текста как эмоции и заменяют их изображениями, которые не копируются как текст, а вместо этого удаляются.

Комментарии:

1. Это более вероятно, но решение то же самое: получите фактический файл, не копируйте и не вставляйте текст.

2. Спасибо, похоже, автор кода, должно быть, скопировал / вставил, и [i], рассматриваемый как html-тег, звучит именно так, как и произошло!! Я свяжусь с ним, чтобы узнать, есть ли у него исходный файл…

Ответ №2:

С вашим пониманием все в порядке, этот код просто совершенно бессмысленный.

 d  ;  //this would just increment to the next element?
  

Это было бы, если бы d был указатель. Однако, поскольку d это массив, это просто незаконно.

Комментарии:

1. Подождите, разве массивы и указатели в основном не одинаковы? Шучу ! 😉

Ответ №3:

Это, безусловно, ошибка копирования / вставки. Я поддался искушению скопировать / вставить код в какой-то момент во время игрового технологического проекта с использованием скриптов Lua. Если скрипт Lua завершается с ошибкой, нет обратной связи / вывода, указывающих на сбой чего-либо (что очень расстраивает). После многочасовой отладки я понял, что мой скрипт использует «умные кавычки».

Хотя этот код не работает, он все еще может научить вас некоторым вещам о C .

 int perm [20];

cout << endl << perm << endl;
cout << endl << amp;perm[0] << endl;
  

‘perm’ возвращает адрес памяти первого элемента массива. итак, когда вы пытаетесь присвоить ‘i’ значению ‘perm’ в этом основном цикле for (20 раз), теперь вы будете знать, что вы пытались присвоить целое число адресу памяти, отсюда и ошибка несовместимого типа.

Однако второй раздел сильно нарушен, и я не могу извлечь из этого много уроков: P.

Я добавил в пример программу, чтобы показать, как можно использовать указатели / массивы:

 #include <iostream>

using namespace std;

int main()
{
    int d[20] = {0}; // 20 ints, set to 0
    int * ptr = d; // points to d[0]'s memory address

    for(int i = 0; i < 20; i  )
    {
        d[i] = 0   i; // set array values
    }

    for(int i = 0; i < 20; i  )
        {    
                // iterates through d and prints each int
        cout << endl << "d[i]: " << d[i] << endl;
                // dereferences the ptr to get the same int
                // then incraments the position of the pointer for next time
        cout << endl << "*ptr  : " << *ptr   << endl;
    }

    getchar();

    return(0);
}