Использование двойного указателя - PullRequest
1 голос
/ 24 июня 2010

Пожалуйста, посмотрите на следующий код:

#include <stdio.h>
#include <iostream>

using namespace std;
typedef struct MyType{
int num1;
};

void test(MyType **src)
{
 MyType *ret=new MyType;
 ret->num1=666;
 *src=ret;
}

int main(){
 MyType  *mSrc;
 test(&mSrc);
 printf("%d Address\n",mSrc);
 printf("%d Value \n",mSrc->num1);
}

Мне интересно, если метод test () был реализован следующим образом, почему назначение указателя внутри метода test () не видно вызывающей стороне?

 void test(MyType *src)
    {
     MyType *ret=new MyType;
     ret->num1=666;
     src=ret;     //Why this assignment is only valid inside this method?
    }

Как реализовать эту функцию без использования двойного указателя в подписи?

Ответы [ 3 ]

5 голосов
/ 24 июня 2010
  void test(MyType *src)

Здесь src - это просто локальная переменная в функции test, это копия указателя, который вы ей передали. Присвоение локальной переменной не влияет на вызывающего.

Если вы хотите, чтобы src ссылался на ту же переменную, которую вы передали, используйте reference

void test(MyType *&src)
4 голосов
/ 24 июня 2010

потому что вы передаете копию указателя src и изменяете только копию внутри функции.

1 голос
/ 24 июня 2010

Поскольку значение , передаваемое с src, является адресом, на который указывает указатель.Если вы измените его, оно будет изменено только внутри функции.

Это то же самое, что если вы передадите целое число и измените его значение.Значение изменяется только внутри функции.

В Си все равно вызов по значению , поэтому у нас есть «специальные» значения (но они все ещезначения), которые могут указывать на некоторое местоположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...