2016-05-16 2 views
-2
#include <iostream> 
#include <cstdlib> 
using namespace std; 
int **j; 
int Alter(int *par); 
int main() 
{ 
    static int a = 10; 
    a = Alter(&a); 
    std::cout << "a : " << a << std::endl; 
    return 0; 
} 
int Alter(int *par) 
{ 
    int **j = &par; 
    j += 10; 
    return **j; 
} 

Что случилось с этим кодом выхода значения мусора .. Как вернуть указатель на указатель или как мы можем оптимизировать этот CDE без использования указателя на указательC++: Как вернуть указатель на указатель из функции?

+2

Что не так с этим кодом? 'j + = 10;' – 101010

+1

Как вы думаете, 'j + = 10;' собирается делать? – NathanOliver

+0

@NathanOliver Это просто случайный, просто хочу изменить значение и вернуть его –

ответ

5

Если вы хотите Alter, чтобы увеличить a переменные на 10 вы должны разыменовывании вашего j внутри него:

**j += 10; 
^^ 

или вместо указателя на указатель, используйте ссылку:

int Alter(int &par); 
int main() 
{ 
    static int a = 10; 
    a = Alter(a); 
    std::cout << "a : " << a << std::endl; 
    return 0; 
} 
int Alter(int &par) 
{ 
    par += 10; 
    return par; 
} 

, но тогда вам не нужно назначать в a = Alter(a);.

5

Откладывая факт, что j += 10 инкрементирует указатель, а не значения (что, вероятно, не то, что вы хотите сделать), главная ошибка в том, что указатель передается в функцию передается по значению в любом случае ,

Это означает, что int *j = &par дает адрес аргумента указателя в стеке, переданный функции Alter, а не адрес переданной переменной.

Что вам нужно сделать, это передать только ссылку на переменную и изменить его непосредственно:

int Alter(int& par) { 
    par += 10; 
    return par; 
} 

int main() { 
    static int a = 10; 
    Alter(a); 
} 

Вы можете сделать это также с указателями, но вам придется использовать ненужные операторы разыменования.

+0

Alter должен быть недействительным. Нет необходимости возвращать пар, так как он не используется. –

Смежные вопросы