Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Указатели и массивы


Рекомендуемые сообщения

Накопилось несколько вопросов, а кто же мне доходчиво то ответит на них, кроме как форумчане? :g:))

Как я понимаю имя массива - это и есть указатель на его нулевой элемент, т.е. int a[3] p=*(a+3) переменной п будет присвоено значение третьего элемента массива а. Верно?

Вопрос: как объявить массив при помощи ТОЛЬКО указателей? Ну одномерный я и сам могу (int *p=new int[5]). А как быть с двухмерным? Как его объявлять при помощи указателй???

Еще вопрос: как обращаться к элементам двумерного массива, объявленного при помощи указателей? если массив объявлен обычным образом, то по моему-так можно: *(*(а+1)+3). Здесь мы обращаемся к элементу в первой строке и третьем столбце? Как это сделать, если массив объявлен при помощи указателей?

И еще один вопрос. Как читать двумерный массив из файла???

Ссылка на комментарий
Поделиться на другие сайты

Масив 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

Ссылка на комментарий
Поделиться на другие сайты

А как читать двумерный массив из файла???

Английского к сожалению не знаю, лучше дайте на русском...

int** p=new int*[4];

Вопрос номер один: зачем две звездочки перед р??

Вопрос номер два: Зачем звездочка после int?

Ссылка на комментарий
Поделиться на другие сайты

Две звездочки потому что это указатель на указателя

Поэтому и здесь две звездочки - два раза делаем дереференцию:

*(*(а+1)+3)

На втором вопросе - потому что делаем масив из масивов, а масив у нас int* p;

т.е. одномерний масив:

int* p1;

Нам нужен двухмерный, т.е. массив из одномерних массивов, от int* p; т.е.

int** p2 = int* (p1) [ x раз ]

Ссылка на комментарий
Поделиться на другие сайты

а если сделать указателя на указателя, но дать им разное имя?

Код такой?

int *p1=new int[5];

int *p2=new int*(p1)[5];

А как тогда обращаться к элементам двумерного массива, объявленного таким способом?

И еще. Если вводить массив, объявленный при помощи указателей, то знак & ставить не надо и звездочки тоже, да?? Ведь & берет адрес, а указатель это и есть адрес, да? Напишите пример, если можно

ЗЫ: Вопрос как ввести двумерный массив из файла еще в силе!

Ссылка на комментарий
Поделиться на другие сайты

Звездочку надо пользувать

p - это адрес, если сделаеш p = то ти присвоиш новый адрес. Чтобы поменять число, записано по этому адресу, надо делать *p =

Разсмотри хотя бы изходники в статье, которую дал - увидеш много примеров

Насчеть файла, а файл в каком виде у тебя?

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

А зачем работать с массивом через указатели? Конечно, если хочется, можно, но квадратные скобки заметают под ковер много сложностей. Вот мой набросок примера ввода-вывода в 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));

Это будет эквивалентом.

Ссылка на комментарий
Поделиться на другие сайты

Ну с указателями ко мне препод пристал, да и разобраться бы не мешало!

Только вот не пойму я, как ввести квадратную матрицу 3х3, если она записана в файле в естественном виде (т.е. не в строку, а как матрица)

Как ее считать в массив (без указателей)???

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

Файл - линейная структура. Матрица в нем записывается так: первая строка матрицы, вторая строка матрицы, третья... Если, конечно, ты не предпочтешь другой порядок, например, записывать матрицу по столбцам, а не по строкам. В любом случае матрица записывается путем ее последовательного обхода, а читается в обратном порядке.

У меня в примере в файл и записывалась (и считывалась потом) матрица 2х3.

Ссылка на комментарий
Поделиться на другие сайты

Тролль, спасибо, я просто думал, что он не будет читать матрицу в естественном виде из файла, а потом решил попробовать и все получилось.

Спасибо! Вы мне очень помогли!

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...