Можно ли выделить динамическую память для указателя на C, используя функции void? [Дубликат]

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            System.out.println("getView " + position + " " + convertView);
            ViewHolder holder = null;

            if (convertView == null) {

                convertView = LayoutInflater.from(conText).inflate(
                        R.layout.gridgoggle, parent, false);
                holder = new ViewHolder();

                convertView.setTag(holder);

            } else {
                holder = (ViewHolder) convertView.getTag();
            }


            holder.imageView1.setImageResource(Integer.parseInt((mData
                    .get(position).get("image"))));

            holder.imageView1.setId(position);

            holder.imageView1.setOnClickListener(new OnClickListener() {
                public void onClick(View v)
 {

                                   int id = v.getId();
//here id is position.

  Intent myIntent = new Intent(this, StopsScheduleActivity.class);
  myIntent.putExtra("stop", id);

 startActivity(myIntent);


                }
            });
            return convertView;
        }
30
задан Ian R. O'Brien 30 March 2016 в 15:05
поделиться

4 ответа

Потому что вы передаете копию указателя. Чтобы изменить указатель, вам нужно что-то вроде этого:

void foo(int **ptr) //pointer to pointer
{
    *ptr = new int[10]; //just for example, use RAII in a real world
}

или

void bar(int *& ptr) //reference to pointer (a bit confusing look)
{
    ptr = new int[10];
}
64
ответ дан Andrew 16 August 2018 в 04:39
поделиться
  • 1
    Но когда я пробую ваш подход, он падает на эту строку *targetBubble = bubbles[i];, и я передаю такой аргумент clickOnBubble(mousePos, bubbles, &targetBubble); – c0ntrol 7 August 2012 в 10:28
  • 2
    @ user1295618: какая ошибка вы видите? Возможно, я вне пределов досягаемости – Andrew 7 August 2012 в 10:35
  • 3
    Ошибка сегментации – c0ntrol 7 August 2012 в 10:41
  • 4
    @ user1295618: задайте новый вопрос и напишите свой новый код там. Потому что трудно сказать, в чем проблема, не видя ваш фактический код – Andrew 7 August 2012 в 10:42
  • 5
    Но второй подход работает, спасибо. – c0ntrol 7 August 2012 в 10:49

, если вы пишете

int b = 0;
foo(b);

int foo(int a)
{
  a = 1;
}

, вы не меняете 'b', потому что a является копией b

, если вы хотите изменить b, вам нужно будет передать адрес из b

int b = 0;
foo(&b);

int foo(int *a)
{
  *a = 1;
}

одинаково для указателей:

int* b = 0;
foo(b);

int foo(int* a)
{
  a = malloc(10);  // here you are just changing 
                   // what the copy of b is pointing to, 
                   // not what b is pointing to
}

, поэтому для изменения, где b указывает, чтобы передать адрес:

int* b = 0;
foo(&b);

int foo(int** a)
{
  *a = 1;  // here you changing what b is pointing to
}

hth

18
ответ дан Anders K. 16 August 2018 в 04:39
поделиться

Вы не можете изменить указатель, если вы не передадите его ссылкой (не const) или как двойной указатель. Передача по значению делает копию объекта, и любые изменения в объекте производятся копией, а не объектом. Вы можете изменить объект, на который указывает указатель, но не сам указатель, если вы проходите по значению.

Прочитайте этот вопрос, чтобы лучше понять различия в деталях . Когда пройти мимо ссылку и когда передать указатель в C ++?

6
ответ дан Community 16 August 2018 в 04:39
поделиться

Вы передаете указатель по значению.

Передайте ссылку на указатель, если вы хотите его обновить.

bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t)
21
ответ дан Daniel Daranas 16 August 2018 в 04:39
поделиться
  • 1
    +1. Первый ответ, который делает это правильно в контексте C ++. Ответы, предлагающие двунаправленные указатели, - это старая возможность сделать это. – paxdiablo 7 August 2012 в 10:02
Другие вопросы по тегам:

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