Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.60
ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
#1

Указатель на строку массива - C++

14.05.2011, 20:57. Просмотров 3334. Ответов 10
Метки нет (Все метки)

Попалось на глаза задание:
Написать функцию get_arr, которая предназначена для заполнения значениями двумерных массивов произвольной длины. Функция имеет два аргумента
а) arr - указатель на первую строку массива;
б) len - число элементов в строке.
Вот пытаемся разобрать,как можно с помощью указателя на строку заполнить массив?Объясните,если не трудно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2011, 20:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на строку массива (C++):

Приведение любого двумерного массива к типу указатель на указатель - C++
Допустим, есть несколько массивов int arr1; int arr2; int arr3; Какое преобразование нужно сделать, чтобы подобные присвоения...

Указатель на строку: как выводить не всю строку целиком, а конкретную букву - C++
Есть программка: #include<iostream> using namespace std; void fn_str1(int i,string str1,char *p) { p=&str1; ...

Разработать и испытать функцию, которая переворачивает строку и возвращает указатель на перевёрнутую строку - C++
Разработать и испытать функцию, которая переворачивает строку и возвращает указатель на перевёрнутую строку. Прототип функции инверсии...

Указатель на строку - C++
Скажите пожалуйста если есть string str="Big!"; string *pt=&str;, как можно обратиться к 'B' или '!' через pt, и возможно ли это...

Указатель на строку - C++
Хочу считать строку какой угодно длины, ограниченной разве памятью компа.Затем надо получить указатель на эту строку, чтоб работать, как...

Указатель на строку - C++
Доброго времени суток. У меня вопрос по поводу *char К примеру у меня есть функция void get(char *s1) { s1="hello"; } ...

10
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 21:05 #2
Цитата Сообщение от ol4ik Посмотреть сообщение
Попалось на глаза задание:
Написать функцию get_arr, которая предназначена для заполнения значениями двумерных массивов произвольной длины. Функция имеет два аргумента
а) arr - указатель на первую строку массива;
б) len - число элементов в строке.
Вот пытаемся разобрать,как можно с помощью указателя на строку заполнить массив?Объясните,если не трудно.
Если память под двухмерный массив не была выделена одним куском, то никак.
Если была, и неизвестно количество строк в массиве, то никак.
Если известно количество строк и память выделена одним куском, то можно просто скопировать указатель и увеличивать его для каждого добавления, пока он не дойдет до значения произведения длины строки на длину массива строк.
0
ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
14.05.2011, 21:14  [ТС] #3
Jtalk, количество строк и столбцов задаётся пользователем,а потом под массив с таким количеством столбцов и строк выделяется память,так что мне не совсем понятно,что значит "не одним куском"
и непонятно,что значит "копировать указатель"?
0
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 21:31 #4
Цитата Сообщение от ol4ik Посмотреть сообщение
Jtalk, количество строк и столбцов задаётся пользователем,а потом под массив с таким количеством столбцов и строк выделяется память,так что мне не совсем понятно,что значит "не одним куском"
и непонятно,что значит "копировать указатель"?
Вот это одним куском
C
1
int ** a = (int**)malloc(sizeof(int)*height*width);
А вот это нет
C++
1
2
3
int ** a = new int*[10];
for (int i = 0 ; i < 10 ; i++)
    a[i] = new int[10];
Выделять память первым способом - костыль и извращение, но это единственный способ работать с двухмерным массивом, если нет доступа к нему непосредственно (вы в условии написали, что дан указатель на первую строку - соответственно, без указателя на массив указателей на строки доступ к остальным строкам можно получить только если они выделены в непрерывной области памяти).

А вот новая редакция условия - где количество строк и столбцов задается явно и есть доступ непосредственно к этому массиву - уже решается элементарно.
0
ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
14.05.2011, 21:42  [ТС] #5
Jtalk, ну это было бы логично предположить,раз уж для начинающих)
так что с указателем делать?оо
0
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 21:53 #6
Цитата Сообщение от ol4ik Посмотреть сообщение
Jtalk, ну это было бы логично предположить,раз уж для начинающих)
так что с указателем делать?оо
Там не было указано, что для начинающих. %)
Задание сформулировано очень туманно. Как бы обычный способ заполнения массива - присваивание значения типа
C++
1
a[i][j] = value;
Но что нужно в задании я, если честно, не совсем понимаю.
0
ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
14.05.2011, 21:59  [ТС] #7
Цитата Сообщение от Jtalk Посмотреть сообщение
Там не было указано, что для начинающих. %)
моя ошибка +)
ну значит просто логично :Р

Цитата Сообщение от Jtalk Посмотреть сообщение
Как бы обычный способ заполнения массива
уж про это можно было и не говорить)
как массив инициализируется и ежу понятно

Цитата Сообщение от Jtalk Посмотреть сообщение
Но что нужно в задании я, если честно, не совсем понимаю.
что нужно в задание-то как раз написано,а вот как это сделать +)

нужны идеи
0
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 22:03 #8
Раз в функцию не передаются значения, значит она должна запросить их ввод.
0
ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
14.05.2011, 23:04  [ТС] #9
Jtalk, ну так весь смысл в том,чтобы в функции заполнить массив .-.

Добавлено через 54 минуты
Это была задача моей подруги и она с ней справилась
вот код,если кому понадобится
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
 
void mas(int**, int,int);
//----------------------
//const int n1=5, n2=4;
void main()
{clrscr();
int x[6][6]; //y[20];
int i,j,n1,n2,**pp,*p;
//-----------------------------------
 printf("vvedite razmernost n1 n2\n");
 scanf("%d %d",&n1,&n2);
 p=&x[0][0];
 **pp=*p;
mas(pp,n1,n2);
getch();
}
 
void mas(int **x, int n1, int n2)
{int i,j;
 
 for (i=0; i<n1; i++)
 for (j=0; j<n2; j++)
 { printf("vvod x[%d][%d]\n",i,j);
  scanf("%d", &x[j]);}
   for (i=0; i<n1; i++)
 for (j=0; j<n2; j++)
 { printf("x[%d][%d]=%d\n",i,j,x[j]);  }
 
return ;
 }
0
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
15.05.2011, 01:19 #10
Цитата Сообщение от ol4ik Посмотреть сообщение
Jtalk, ну так весь смысл в том,чтобы в функции заполнить массив .-.
По поводу приведенного кода:

Если ввести размерность 10х10 будет весело.
А нет, ошибся, оно с любыми значениями SIGSEGV выбросит.


C++
1
 **pp=*p;
Копируем в первый элемент неинициализированного двухмерного массива первый элемент статического массива. И получаем access violation.


Для void-функций return писать не обязательно.


Массив задается статически, с фиксированными границами. А в условии размерность его не оговорена. Фэйл.


Подключен заголовочный файл потоков ввода/вывода C++, но используется I/O из C. Причем плюсовые хидеры std не содержат в своем названии расширение. Хидеры с расширением устарели поди еще до моего рождения.

C++
1
p=&x[0][0];
Это вообще эпик. Статические массивы приводятся к указателям автоматически.


Решил потренировать мозг и вспомнить молодость:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * @brief Array filling routine
 * @param height of array needed
 * @param width of array needed
 * @return pointer to 2-D array that has been filled or NULL if height or width
 * are invalid
 *
 * Please take note that you should clear array's memory by yourself.
 */
int**
input(int height, int width)
{
    // Arguments control
    if (height <= 0 || width <= 0)
        return NULL;
 
    // Memory allocating
    int** array = new int*[height];
    for (int i = 0 ; i < height ; i++)
        array[i] = new int[width];
 
    // Items input
    using std::cout;
    using std::cin;
    using std::endl;
    using std::flush;
 
    cout<<"Let us start!"<<endl;
 
    for (int i = 0 ; i < height ; i++)
        for (int j = 0 ; j < width ; j++)
        {
            cout<<"Input number with indexes "<<i<<" "<<j<<": "<<flush;
            cin>>array[i][j];
        }
 
    // Well done
    return array;
}
1
ol4ik
22 / 21 / 6
Регистрация: 08.04.2010
Сообщений: 90
15.05.2011, 01:29  [ТС] #11
Jtalk, я ту задачу даже не проверяла,потому что у меня Visuаl C++,а она через Turbo C++ делает или что-то вроде того

но я ей дала код и скопировала замечания
ей,наверное,понадобится оо"
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2011, 01:29
Привет! Вот еще темы с ответами:

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Массив и указатель на строку - C++
class Frabjous { private: char fab; public: Frabjous(const char *s=&quot;C++&quot;):fab(s) {} ... }

Вернуть указатель на строку - C++
Найти в массиве вторую строку, содержащую хотя бы один ноль. Вернуть указатель на эту строку, вывести ее на экран.

указатель на строку типа Integer - C++
Необходимо в тэг компонента записать указатель на строку. Можно ли задать указатель на строку типа Integer напрямую? я делал так ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
15.05.2011, 01:29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru