различие между указателем и параметром ссылки?

Мне удалось разобраться с этим, установив переменную int для Position и вызвав ее в классе MainActivity внутри запущенного таймера. Пожалуйста, смотрите код ниже.

    public class MainActivity extends AppCompatActivity {

    CountDownTimer questionTimer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnStart = (Button) findViewById(R.id.start);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setQuestions();
                timer();
            }
        });

    }//End of create()

    public void timer() {

        questionTimer = new CountDownTimer(30000, 1000) {

            public void onTick(long millisUntilFinished) {
                timer = (TextView) findViewById(R.id.timer);
                timer.setText("Seconds Remaining:  " + millisUntilFinished / 1000);

                if (adapter.getEndQuiz() == 5) {
                    questionTimer.cancel();
                }
            }

            public void onFinish() {
                timer.setText("Done!");
            }
        }.start();

    }   

    public void setQuestions() {

        ArrayList<Questions> qArrList = new ArrayList<>();

        for (int i = 0; i < 5; i++) {
            ques = new Questions();
            ques.setQuestion("");
            qArrList.add(ques);
        }
        adapter = new AdapterListView(getBaseContext(), R.layout.item_listview, qArrList);
        questListView.setAdapter(adapter);
    }   

}//End of Class

Адаптер

    public class AdapterListView extends ArrayAdapter<Questions> {

    Context mContext;
    LayoutInflater inflater;
    private ArrayList<Questions> questionsArrayList;
    private Questions quesObject;
    private ArrayList<String> quesList = new ArrayList<String>();
    private int a, b, ab, c, d, cd, e, f, ef, g, h, gh, i, j, ij;
    private ArrayList<Integer> answersList = new ArrayList<Integer>();
    private int endQuiz = 0;

    public AdapterListView(Context context, int resource, ArrayList<Questions> questionsArrayList) {
        super(context, resource);
        this.mContext = context;
        this.setQuestionsArrayList(questionsArrayList);
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override

    public View getView(final int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_listview, null);
            holder = new ViewHolder();
            holder.questionTextView = convertView.findViewById(R.id.question);
            holder.editText = convertView.findViewById(R.id.ans_edit_text);
            holder.imgTrue = convertView.findViewById(R.id.ans_true);
            holder.imgFalse = convertView.findViewById(R.id.ans_false);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        quesObject = getQuestionsArrayList().get(position);
        int count = 0;
        if (position == 0) count = 1;
        else if (position == 1) count = 2;
        else if (position == 2) count = 3;
        else if (position == 3) count = 4;
        else if (position == 4) count = 5;

        Random rand = new Random();
        a = (rand.nextInt(15) + 1);
        b = (rand.nextInt(10) + 1);
        ab = a + b;

        c = (rand.nextInt(15) + 1);
        d = (rand.nextInt(10) + 1);
        cd = c + d;

        e = (rand.nextInt(15) + 1);
        f = (rand.nextInt(10) + 1);
        ef = e + f;

        g = (rand.nextInt(15) + 1);
        h = (rand.nextInt(10) + 1);
        gh = g + h;

        i = (rand.nextInt(15) + 1);
        j = (rand.nextInt(10) + 10);
        ij = i + j;

        quesList.add(a + " + " + b);
        quesList.add(c + " + " + d);
        quesList.add(e + " + " + f);
        quesList.add(g + " + " + h);
        quesList.add(i + " + " + j);

        getAnswersList().add(ab);
        getAnswersList().add(cd);
        getAnswersList().add(ef);
        getAnswersList().add(gh);
        getAnswersList().add(ij);

        holder.questionTextView.setText("Q  " + count + ": \t" + quesList.get(position));

        holder.editText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                if (holder.editText.getText().toString().trim().length() > 0) {
                    int inputNum = Integer.parseInt(String.valueOf(holder.editText.getText().toString().trim()));

                    if (getAnswersList().get(position) != inputNum) {
                        holder.imgFalse.setVisibility(View.VISIBLE);
                        holder.imgTrue.setVisibility(View.GONE);
                    } else {
                        holder.imgTrue.setVisibility(View.VISIBLE);
                        holder.imgFalse.setVisibility(View.GONE);
                    }

                    if(position == 0) setEndQuiz(1);
                    else if(position == 1) setEndQuiz(2);
                    else if(position == 2) setEndQuiz(3);
                    else if(position == 3) setEndQuiz(4);
                    else if(position == 4) setEndQuiz(5);
                }
            }
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }
        });
        return convertView;
    }

    @Override
    public int getCount() {
        return getQuestionsArrayList().size();
    }

    static class ViewHolder {
        TextView questionTextView;
        EditText editText;
        ImageView imgTrue, imgFalse;
    }
}
64
задан Artjom B. 27 November 2014 в 14:01
поделиться

8 ответов

Ссылки C++ намеренно не определяются в стандарте, который будет реализован с помощью указателей. Ссылка больше похожа на "синоним" к переменной, чем указатель на него. Эта семантика открывает некоторую возможную оптимизацию для компилятора, когда возможно понять, что указатель был бы излишеством в некоторых ситуациях.

еще Несколько различий:

  • Вы не можете присвоить ПУСТОЙ УКАЗАТЕЛЬ ссылке. Это - решающее различие и главная причина, которую Вы предпочли бы один по другому.
  • при взятии адреса указателя Вы получаете адрес переменной указателя. При взятии адреса ссылки Вы получаете адрес упоминаемой переменной.
  • Вы не можете повторно присвоить ссылку. Как только это инициализируется, это указывает на тот же объект для своей всей жизни.
65
ответ дан Drew Noakes 24 November 2019 в 15:53
поделиться

Игнорирование каждого синтаксического сахара и возможностей, которые могут быть сделаны с тем а не с другим и различием между указателями и ссылками, объясненными в других ответах (к другим вопросам)... Да те два являются функционально точно тем же! Оба вызывают функцию и обе виртуальных функции дескриптора одинаково хорошо.

И не, Ваша строка не режет. Это просто связывает ссылку непосредственно на объект, на который указывает указатель.

Некоторые вопросы на том, почему Вы хотели бы использовать один по другому:

Вместо того, чтобы пытаться придумать различия самостоятельно, я делегирую Вас тем в случае, если Вы хотите знать.

15
ответ дан Community 24 November 2019 в 15:53
поделиться

Ссылка является постоянным указателем, т.е. Вы не можете изменить ссылку для обращения к другому объекту. Если Вы изменяетесь, значение относящихся объектных изменений.

Для Исключая:

       int j = 10;
       int &i = j;
       int l = 20;
       i = l; // Now value of j = 20

       int *k = &j;
       k = &l;   // Value of j is still 10
13
ответ дан Vinay 24 November 2019 в 15:53
поделиться

Я не использовал C++ в долгое время, таким образом, я даже не собираюсь пытаться действительно ответить на Ваш вопрос (извините); Однако Eric Lippert просто отправил превосходная статья об указателях/ссылках, что я полагал, что укажу на Вас на.

5
ответ дан Chris Shaffer 24 November 2019 в 15:53
поделиться

Да они функционально идентичны. Так как ссылка потребует, чтобы Вы установили его на объект перед использованием его, Вы, привычка должна иметь дело с нулевыми указателями или указателями на недопустимую память.

также важно видеть семантическое различие:

  • Использование ссылка, когда Вы на самом деле передали бы нормальный объект - но это является столь большим, что имеет больше смысла передавать ссылку на объект вместо того, чтобы делать копию (если Вы не изменяете объект, который является).
  • Использование указатель, когда Вы хотите иметь дело с адресом памяти, а не с объектом.
6
ответ дан Patrick Glandien 24 November 2019 в 15:53
поделиться

Не уверенный, если кто-либо ответил на Ваш 2-й вопрос, скрытый внизу о разрезании... не, которое не вызовет разрезание.

Разрезание состоит в том, когда производный объект присвоен (скопированный) в объект базового класса - специализация производного класса "нарезана" прочь. Обратите внимание, что я сказал , объект копируется, мы не говорим об указателе том, чтобы быть, копировал/присваивал, но сами объекты.

В Вашем примере, этого не происходит. Вы просто разыменовываете указатель на объект Панели (таким образом, приводящий к объекту Панели) используемый в качестве rvalue в ссылочной инициализации. Не уверенный я разобрался в своей терминологии...

4
ответ дан Dan 24 November 2019 в 15:53
поделиться

Как все остальные упомянули в ссылках реализации, и указатели являются в основном тем же. Существуют некоторые незначительные протесты:

  • Вы не можете присвоить ПУСТОЙ УКАЗАТЕЛЬ ссылке (shoosh, упомянул это): это значительно, так как нет никакого "неопределенного" или "недопустимого" ссылочного значения.

  • можно передать временную переменную как константа ссылка, но не законно передать указатель на временный файл.

, Например, это хорошо:

class Thingy; // assume a constructor Thingy(int,int)
void foo(const Thingy &a)
{ 
   a.DoSomething();
}

void bar( ) 
{
  foo( Thingy(1,2) );
}

, но большинство компиляторов будет жаловаться приблизительно [1 114]

void foo2( Thingy * a);

void bar2()
{
  foo( &Thingy(1,2) );
}
  • , Взятие адреса переменной для получения указателя вынуждает компилятор сохранить его к памяти. Присвоение ссылки на локальную переменную просто создает синоним; в некоторых случаях это может позволить компилятору сохранять данные по регистру и избегать хранилище хита загрузки . Однако это только относится к локальным переменным - как только что-то передается в качестве параметра ссылкой, нет никакого предотвращения, сохраняющего ее для укладки.

 

void foo()
{
   int a = 5;
   // this may be slightly more efficient
   int &b = a;
   printf( "%d", ++b );
   // than this
   int *c = &a;
   printf( "%d", ++(*c) );
}
  • Точно так же __ ограничивают ключевое слово , не может быть применен к ссылкам, только указатели.

  • Вы не можете сделать адресной арифметики с указателями со ссылками, поэтому тогда как, если у Вас есть указатель в массив тогда, следующий элемент в массиве может иметься через p+1, ссылка только когда-либо указывает на одну вещь в своей всей жизни.

3
ответ дан Crashworks 24 November 2019 в 15:53
поделиться

Функции являются, очевидно, не "тем же", но относительно виртуального поведения они будут вести себя так же. Относительно разрезания это только происходит, когда Вы имеете дело withvalues, не ссылки или указатели.

1
ответ дан 24 November 2019 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: