Показать полную графическую версию : Вопросы начинающего программиста
vadimiron
10-01-2005, 00:58
Как сделать, чтобы функция возвращала массив в С или С++
int func()
{
int B[6]={0,1,2,3,4,5};
return B;
}
int C[6]=func();
Как исправить этот код, чтобы он работал?
Там вроде надо как то с пойнтерами поигаться, я в них пока слаб....
hasherfrog
10-01-2005, 01:20
Во-о-о-от. А теперь пускай сюда придут люди, которые говорят, что "С круче Дельфи" и расскажут в двух словах, как бы это так хитро сделать, чтобы программа была ясна и понятна...
Netscaper
10-01-2005, 01:30
Вот пример.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int *wrong_func()
{
int b[6] = {0, 1, 2, 3, 4, 5};
int *ptr;
ptr = &b[0];
return ptr;
}
int *solve_func()
{
int *b;
int i;
b = (int *)malloc(sizeof(int) * 6);
for (i = 0;i < 6; i++)
b[i] = i;
return b;
}
void main()
{
int *c;
int i;
c = wrong_func();
for(i = 0;i < 6; i++)
printf("%d ",c[i]);
printf("\n");
c = solve_func();
for(i = 0;i < 6; i++)
printf("%d ",c[i]);
printf("\n");
free((void *)c);
getchar();
}
Первая функция wrong_func возвращает указатель на массив, который указывается внутри этой функции. Как видно, возвращается непонятно что. Дело в том, что этот массив создается только для этой функции (я не хочу углублятся в принципы организации памяти) и, следовательно, значения будут иметь место только в ней. Намного проще использовать динамический массив, например, как в функции solve_func, который создается и иницилизируется внутри неё. Дело в том, что динамический массив создается (функция malloc)«глобально» и будет действителен, пока не будет вызвана функция free (будет уничтожен). Надеюсь, понятно изложил. Хотя, всё-таки, присоединяюсь к мнению hasherfrog, про то, что книжки надо читать. Желательно без чьей-либо помощи. Проще говоря, разобраться самому. :yes:
Массив полностью вернуть из функции нельзя. Можно напрямую работать с массивом через указатели, тогда необходимость возвращать что-нибудь отпадает. Само имя массива по сути дела - всего лишь указатель.
Пример
#include<stdio.h>
void copy(int *b, int *c);
void main(){
int b[5]={0,1,2,3,4};
int c[5];
int i;
copy(b,c);
for(i=0;i<5;i++)
printf("%d\n", c[i]);
}
void copy(int *b, int *c){
int i;
for(i=0;i<5;i++)
*(c+i)=*(b+i);}
vadimiron
11-01-2005, 23:28
mrcnn
а что значит *(с+i)=*(b+i) ?
c и b - массивы, к элементу массива же вроде так обращаемся: c[i]
hasherfrog
12-01-2005, 08:18
vadimiron
Если очень примитивно объяснять, то указатель + целое == указатель[целое]
mrcnn
а что значит *(с+i)=*(b+i) ?
c и b - массивы, к элементу массива же вроде так обращаемся: c[i]
Я же сделал пометку, что имя массива по сути дела _указатель_ на первый элемент массива, имя массива с указанием номера элемента - _указатель_ на i элемент массива
таким образом конструкция *(c+i) указывает на i элемент массива c. По сути дела *(c+i) аналогично c[i], а *(с+i)=*(b+i) аналогитчно c[i]=b[i]
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.