Другие языки программирования и технологии

Инициализация массива. Указатели.

1) int x = 10, y = 2, z = 10, arr [x] [y] [z];
for (int count = 0; count < x*y*z; count++) printf (" [%d] %d \n", count, *(arr + count) = rand ()%);
Почему эта форма неправильна? Ведь arr тоже, что &arr [0] [0] [0], а при прибавлении единицы к адресу указатель перемещается на след. позицию массива (ведь многомерные в памяти тоже представляются последовательно). Поясните пожалуйста....

2) тип данных указатель совпадает с типом данных адрес? Т.е. int* x; int y; Совпадает ли тип данных для x и &y (иными словами, какой тип данных возвращает унарный амперсанд?). И можно ли присвоить указателю его же адрес?
В первом примере ошибка инициализации массива. Для Си требуется размер задавать либо макро константами либо константами явно. В С++ это можно выполнить, используя ключевое слово const. Чтобы использовать указатель, его нужно создать и с помощью операции взятия адреса (&) присвоить ему адрес объекта (переменной) .

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define X 10
#define Y 2
#define Z 10
void main()
{
system("mode con cols=80 lines=450");
srand((unsigned) time(NULL));
intarr[X][Y][Z];
int * beg = NULL;
beg = &arr[0][0][0];
int * end = NULL;
end = &arr[X - 1][Y - 1][Z - 1];
int count = 0;
for (beg; beg <= end; beg++)
{
*beg = rand();
printf (" [%d] = %d \n", count, *beg);
count++;
if (count % 10 == 0) printf("\n");
}
printf("\n\n");
count = 0;
for (int x = 0; x < X; x++)
for (int y = 0; y < Y; y++, printf("\n"))
for (int z = 0; z < Z; z++)
printf (" [%d] = %d \n", count++, arr[x][y][z]);
_getch();
}

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

#include <stdio.h>
#include <conio.h>

void main()
{
int * p = NULL;
printf("\n Addres p = NULL ==> %p", p);
//printf("\n Value p = NULL ==> %d", *p); // Ошибка, указатель пустой!! !
int y = 10;
double x = 10.0;
//p = &x; // Ошибка, тип указателя не совпадает с типом переменной!! !
p = &y; // Операция взятия адреса переменной y и присваивание его по указателю p
printf("\n Addres p = &y ==> %p", p);
printf("\n Value p = &y ==> %d", *p);
_getch();
}
Sanjar S
Sanjar S
92 067
Лучший ответ
Элемент с индексом x*y*z лежит далеко за пределами массива (последние значения индексов по измерениям x-1, y-1 и z-1.
Унарный амперсенд возвращает адрес, который можно присвоить указатею. Но указатель и адрес разные вещи. У указателя есть тип (например, указатель на целое) , у адреса нет. Указателю в принципе можно присвоить его же адрес, иногда с помощью приведения типов, иногда прямо.
P.S. Сложение адреса массива с целым работает только для одномерных массивов. у других - другие типы. Кроме того, задание размера массива переменными вообще по стандарту запрещено, хотя некоторые компиляторы это позволяют.
RK
Rahimullah Khogyany
56 928
Попробуй такой вариант.

int x = 10, y = 2, z = 10, arr [x] [y] [z];
int *parr = &arr;
for (int count = 0; count < x*y*z; count++) printf (" [%d] %d \n", count, *(parr + count * sizeof(int)) = rand ()%);