2014-01-23 4 views
0

У меня есть проблема, когда дело доходит до инициализации указателей.С трудом работая с указателями

void findMM (int *PMM, int *theG) 
{ 
     // code I haven't written yet. It will essentially take two variables from //theG and store it in MM 
} 

int main() 
{ 
    int size; 
    int MM [2] = {1000, 0}; 
    int *theG = NULL; 
    cout << "\nPlease insert size of array:" << endl; 
    cin >> size; 
    theG = new int [size]; 
    findMM(&MM, &theG); //Get error with &MM 
    delete [] theG;  
    return 0; 
} 

компилятор говорит, что аргумент типа int (*)[2] несовместим с параметром типа int ** Так, очевидно, что у меня есть проблемы с кодом, в частности, мой (ссылка?) Из массива MM. Или, может быть, есть другие очевидные недостатки, которые мне не хватает?

Edit попытка 2

void findMM (int *PMM, int *theG) 
{ 
     PMM [1] = 5; 
     theG [0] = 7; 
} 

int main() 
{ 
    int size; 
    int MM [2] = {1000, 0}; 
    int *theG = NULL; 
    cout << "\nPlease insert size of array:" << endl; 
    cin >> size; 
    theG = new int [size]; 
    findMM(MM, theG); 
    cout << MM [1] << endl << theG[0];  
    delete [] theG;  
    return 0; 
} 

Выход будет 5 и 7 правильно?

+2

Массив уже указатель. Удалите & from & MM при вызове findMM. – TheSavage

+5

@TheSavage Это неправда! –

+0

Можете ли вы дать мне более подробный ответ, потому что меня просто смутили ... – Pipsydoodles

ответ

3

С MM является массивом, &MM является указателем на массив (это тип , который вы видите при ошибке). Вместо этого вы, похоже, хотите передать указатель на первый элемент массива. Есть два способа сделать это. Во-первых, вы можете явно получить первый элемент, а затем взять его адрес: &MM[0]. Во-вторых, вы можете положиться на преобразование массива в указатель, чтобы сделать это за вас, и просто пройти MM. Преобразование массива в указатель преобразует массив в указатель на его первый элемент.

+0

Но если бы я хотел передать весь массив, потому что в конечном итоге в конце функции я хочу изменить как MM [0], так и MM [1] на разные значения, поэтому Мне нужно передать оба адреса? – Pipsydoodles

+0

@ user3207442 Нет, вы получаете доступ к элементам массива, используя 'operator []', как обычный массив. – 0x499602D2

+0

@ user3207442 № Знаете ли вы, что 'a [x]' эквивалентно '* (a + x)'? Поэтому, если 'a' является указателем на первый элемент в массиве,' a [1] 'будет делать' * (a + 1) ', который дает вам второй элемент в массиве. Магия! –

1

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

Давайте с основами:

void main() 
{ 
    int a = 2; // a is an int 
    cout << a << endl; // print 2 

    int *b; // b is a pointer-to-int 
    b = &a; // store the address of a in b 
    cout << *b << endl;// print the value that b points to, which is 2 

    int my_array = new int[3]; // allocate an array with 3 integers 
    my_array[0] = 50; // store 50 in the first element of the array 
    my_array[1] = 51; // store 51 in the second element of the array 
    my_array[2] = 52; // store 52 in the third element of the array 
    cout << c[0] << endl; // print 50 

    some_function(my_array, 3); // explained below 
} 

Теперь давайте посмотрим, как передавать массивы в функции. Предположим, мы хотим иметь функцию, называемую some_function, которая получает массив.

void some_function(int *some_array, int size_of_the_array) 
{ 
    // use the array however you like here 
} 

Функция some_function получает указатель на int (также известный как «указатель на Int»). Имя массива всегда является адресом его первого элемента, поэтому, если функция ожидает указатель на int и вы даете ему имя массива int s, вы фактически указываете ему адрес первого элемента в array (это только синтаксические правила C++). Таким образом, функция теперь имеет адрес первого элемента в массиве, он может делать такие вещи, как *some_array, для доступа к первому элементу массива, но что, если он хочет получить доступ к другим элементам? Он добавляет 1 к указателю, который он уже имеет, а затем применяет оператор * к нему: *(some_array + 1). Скажем, int - это 4 байта, если вы добавите 1 к указателю на int, результатом этого добавления будет новый указатель, указывающий на местоположение в памяти на 4 байта вперед, поэтому *(some_array + 93) - это значение в 94-м элементе массив some_array (элементы массива сохраняются последовательно в памяти). Сокращенное обозначение для этого - some_array[93]. Поэтому, если у вас есть int *some_array = new int[100];, то some_array является указателем и some_array[93] - это то же самое, что и *(some_array + 93), что является 94-м элементом в массиве.

Недостаточно самого адреса, вам также нужно знать количество записей в массиве, чтобы вы не пытались получить доступ к элементу, находящемуся за концом массива. В этом примере предположим, что some_function просто печатает содержимое массива, поэтому, если вы не предоставляете 3 в качестве второго аргумента функции, тогда у него не будет никакого способа узнать, когда прекратить добавлять 1 к указателю, который он получил в первый аргумент. Остерегайтесь, однако, что, передавая массив в функцию таким образом, вы не передаете функцию копию массива, вы просто говорите ей, где найти его содержимое в памяти.

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