Бумер Опубликовано 4 апреля, 2007 Жалоба Поделиться Опубликовано 4 апреля, 2007 Накопилось несколько вопросов, а кто же мне доходчиво то ответит на них, кроме как форумчане? )) Как я понимаю имя массива - это и есть указатель на его нулевой элемент, т.е. int a[3] p=*(a+3) переменной п будет присвоено значение третьего элемента массива а. Верно? Вопрос: как объявить массив при помощи ТОЛЬКО указателей? Ну одномерный я и сам могу (int *p=new int[5]). А как быть с двухмерным? Как его объявлять при помощи указателй??? Еще вопрос: как обращаться к элементам двумерного массива, объявленного при помощи указателей? если массив объявлен обычным образом, то по моему-так можно: *(*(а+1)+3). Здесь мы обращаемся к элементу в первой строке и третьем столбце? Как это сделать, если массив объявлен при помощи указателей? И еще один вопрос. Как читать двумерный массив из файла??? Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 4 апреля, 2007 Жалоба Поделиться Опубликовано 4 апреля, 2007 Масив p[4][5] int** p=new int*[4];for(int i=0; i<4; i++)p[i]=new int[5]; *(*(а+1)+3) Угадал Если знаеш английского, можеш почитать здесь Pointers Usage in C++: Beginners to Advanced Ссылка на комментарий Поделиться на другие сайты Поделиться
Бумер Опубликовано 4 апреля, 2007 Автор Жалоба Поделиться Опубликовано 4 апреля, 2007 А как читать двумерный массив из файла??? Английского к сожалению не знаю, лучше дайте на русском... int** p=new int*[4]; Вопрос номер один: зачем две звездочки перед р?? Вопрос номер два: Зачем звездочка после int? Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 4 апреля, 2007 Жалоба Поделиться Опубликовано 4 апреля, 2007 Две звездочки потому что это указатель на указателя Поэтому и здесь две звездочки - два раза делаем дереференцию: *(*(а+1)+3) На втором вопросе - потому что делаем масив из масивов, а масив у нас int* p; т.е. одномерний масив: int* p1; Нам нужен двухмерный, т.е. массив из одномерних массивов, от int* p; т.е. int** p2 = int* (p1) [ x раз ] Ссылка на комментарий Поделиться на другие сайты Поделиться
Бумер Опубликовано 4 апреля, 2007 Автор Жалоба Поделиться Опубликовано 4 апреля, 2007 а если сделать указателя на указателя, но дать им разное имя? Код такой? int *p1=new int[5]; int *p2=new int*(p1)[5]; А как тогда обращаться к элементам двумерного массива, объявленного таким способом? И еще. Если вводить массив, объявленный при помощи указателей, то знак & ставить не надо и звездочки тоже, да?? Ведь & берет адрес, а указатель это и есть адрес, да? Напишите пример, если можно ЗЫ: Вопрос как ввести двумерный массив из файла еще в силе! Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 4 апреля, 2007 Жалоба Поделиться Опубликовано 4 апреля, 2007 Звездочку надо пользувать p - это адрес, если сделаеш p = то ти присвоиш новый адрес. Чтобы поменять число, записано по этому адресу, надо делать *p = Разсмотри хотя бы изходники в статье, которую дал - увидеш много примеров Насчеть файла, а файл в каком виде у тебя? Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 4 апреля, 2007 Жалоба Поделиться Опубликовано 4 апреля, 2007 Бумер: А зачем работать с массивом через указатели? Конечно, если хочется, можно, но квадратные скобки заметают под ковер много сложностей. Вот мой набросок примера ввода-вывода в C для двумерного массива: #include <stdio.h>main(){int m[2][3]={1,2,3,4,5,6};FILE *f;int k,i,j,n1=1,n2=2;f=fopen("my.txt","w");for (i=0;i<=n1;i++) for(j=0;j<=n2;j++) fprintf(f,"%5d",m[i][j]); fclose(f);f=fopen("my.txt","r");for (i=0;i<=n1;i++) for(j=0;j<=n2;j++){fscanf(f,"%d",&k);printf("%5d\n",k);};fclose(f);} Если ты хочешь работать с массивом через указатели, то замени строку for (i=0;i<=n1;i++) for(j=0;j<=n2;j++) fprintf(f,"%5d",m[j]); на for (i=0;i<=n1;i++) for(j=0;j<=n2;j++) fprintf(f,"%5d",*(*m+3*i+j)); Это будет эквивалентом. Ссылка на комментарий Поделиться на другие сайты Поделиться
Бумер Опубликовано 4 апреля, 2007 Автор Жалоба Поделиться Опубликовано 4 апреля, 2007 Ну с указателями ко мне препод пристал, да и разобраться бы не мешало! Только вот не пойму я, как ввести квадратную матрицу 3х3, если она записана в файле в естественном виде (т.е. не в строку, а как матрица) Как ее считать в массив (без указателей)??? Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 4 апреля, 2007 Жалоба Поделиться Опубликовано 4 апреля, 2007 Бумер: Файл - линейная структура. Матрица в нем записывается так: первая строка матрицы, вторая строка матрицы, третья... Если, конечно, ты не предпочтешь другой порядок, например, записывать матрицу по столбцам, а не по строкам. В любом случае матрица записывается путем ее последовательного обхода, а читается в обратном порядке. У меня в примере в файл и записывалась (и считывалась потом) матрица 2х3. Ссылка на комментарий Поделиться на другие сайты Поделиться
Бумер Опубликовано 6 апреля, 2007 Автор Жалоба Поделиться Опубликовано 6 апреля, 2007 Тролль, спасибо, я просто думал, что он не будет читать матрицу в естественном виде из файла, а потом решил попробовать и все получилось. Спасибо! Вы мне очень помогли! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти