Неожиданный вывод при вызове функции массива по адресу - PullRequest
2 голосов
/ 07 ноября 2019

В настоящее время мы изучаем указатели в сочетании с массивами в C / C ++ и должны реализовать некоторую функцию, для которой у нас есть заданный вызов функции. Цель состоит в том, чтобы распечатать значения массива, вызвав функцию с адресом массива. Вывод не соответствует ожидаемому.

Я попытался распечатать значения массива с помощью & и *, а также ни с одним из них.

void ausgabe1D_A(double (*ptr1D)[4]){
    int i{0};
    for (i = 0; i < 4; i++)
        std::cout << *ptr1D[i] << "  ";
}

int main()
{
    double ary1D[4] = {1.1, 2.2, 3.3, 4.4};

    ausgabe1D_A(&ary1D);
}

Я ожидал выводабыть:
1.1 2.2 3.3 4.4

Вместо этого я получил:
0x61fdf0 0x61fe10 0x61fe30 0x61fe50 (с и без &)
1.1 9.09539e-318 0 0 (с *)

РЕДАКТИРОВАТЬ: Извините, если это не ясно, но мы должны вызвать функцию с &ary1D. Мы пробуем разные способы, и ваши пути встречаются в упражнении в следующих функциях, но сейчас нам это нужно с & -оператором.

Ответы [ 5 ]

2 голосов
/ 07 ноября 2019

Когда вы ссылаетесь на массив по его имени, вы обращаетесь к нему по его указателю, поэтому ваш аргумент функции неверен. Это должно быть похоже на

void ausgabe1D_A(double *ptr1D, size_t size){
    int i{0};
    for (i = 0; i < size; i++)
        std::cout << ptr1D[i] << "  ";
}

int main()
{
    double ary1D[4] = {1.1, 2.2, 3.3, 4.4};

    ausgabe1D_A(ary1D,4);
}

Вот изображение памяти массива short integer, например

enter image description here

2 голосов
/ 07 ноября 2019

Хотя другие предоставляют возможное решение, я постараюсь объяснить, почему ваш код не работает. Выражение double(*ptr1D)[4] относится к указателю на массив из четырех элементов (double). Чтобы получить значения, вы должны сначала разыменовать указатель и только затем распечатать его n-ое значение следующим образом:

void ausgabe1D_A(double (*ptr1D)[4])
{
  for (int i = 0; i < 4; i++) {
    std::cout << (*ptr1D)[i] << " "; // <-- note the parenthesis
  }
}
0 голосов
/ 07 ноября 2019

Я думаю, вы ищете способ пройти, используя & оператор. Вот, пожалуйста.

void print( int (*arr)[4])
{
    int *d = *arr;
    for(int i = 0 ;i <4 ; ++i)
    {
        std::cout<<d[i]<<std::endl;
    }
}
int main()
{
    int arr[] = {1,2,3,4};
    print(&arr);

}

Дайте мне знать, если вам трудно понять.

0 голосов
/ 07 ноября 2019

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

Однако я однажды нашел способ в C ++ передать массив по его «истинному» типуиспользуя ссылку (или постоянную ссылку, если требуется неизменность):

#include <iostream>

void ausgabe1D_A(double (&ary1D)[4]){
    // prove type
    std::cout << "Is it really still an array? "
      << (sizeof ary1D == sizeof (double[4]) ? "Yes! :-)" : "No. :-(")
      << '\n';
    for (int i = 0; i < 4; i++)
        std::cout << ary1D[i] << "  ";
}

int main()
{
    double ary1D[4] = {1.1, 2.2, 3.3, 4.4};
    ausgabe1D_A(ary1D);
}

Вывод:

Is it really still an array? Yes! :-)
1.1  2.2  3.3  4.4  

Живая демоверсия на coliru

На самом деле, это похоже на подход OP, за исключением того, что я использую ссылку вместо указателя. Имея это в виду, я подумал, что должна быть возможность исправить подход ОП (игнорируя его полезность), и придумал:

#include <iostream>

void ausgabe1D_A(double (*ptr1D)[4]){
    double *p = &(*ptr1D)[0];
    for (int i = 0; i < 4; i++)
        std::cout << p[i] << "  ";
}

int main()
{
    double ary1D[4] = {1.1, 2.2, 3.3, 4.4};
    ausgabe1D_A(&ary1D);
}

Вывод:

1.1  2.2  3.3  4.4  

Демонстрация в реальном времени на coliru

Et voilà.

0 голосов
/ 07 ноября 2019

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

#include <iostream>

void ausgabe1D_A(double* ptr1D){
    for (std::size_t i = 0; i < 4; i++)
        std::cout << ptr1D[i] << "  ";
}

int main()
{
    double ary1D[4] = {1.1, 2.2, 3.3, 4.4};
    ausgabe1D_A(ary1D);
}

. Способ работает так, что указатель ptr1d по сути является адресомпервый элемент массива.

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