Цитирование C11
, глава §6.5.3.2:
Унарный оператор
blockquote>*
обозначает косвенность. Если операнд указывает на функцию, результат будет обозначать функцию; если он указывает на объект, результатом будет lvalue, обозначающий объект. Если операнд имеет тип '' указатель на тип '', результат имеет тип '' type ''. Если недопустимое значение было присвоено указателю, поведение унарного оператора*
не определено.Таким образом, ваш код вызывает неопределенное поведение .
Также, связанный, из главы §6.2.5:
Тип
blockquote>void
содержит пустой набор значений; это неполный тип объекта, который не может быть завершен.Итак, указатель на
void
является недопустимым операндом для разыменования.Один вероятный практический случай и возможное решение
. Иногда для создания дженериков мы бросаем определенный указатель на
void *
, передаем это как аргумент функции, а затем внутри функции, которую мы выполняем он возвращается к исходному типу, основанному на некоторой известной информации. Это, в соответствии с главой §6.3.2.3, совершенно верно:[...] Указатель на любой тип объекта может быть преобразован в указатель на void и обратно; результат будет сравниваться с исходным указателем.
blockquote>Если это ваш случай и вы разыскиваете внутри функции, вы можете наложить указатель на
- его оригинальный тип (или совместимый тип)
- или
char *
( см. этот ответ, почемуchar *
разрешено )до разыменования.
Попробуйте следующее:
int[][] multi = new int[5][10];
... что является короткой рукой для чего-то вроде этого:
int[][] multi = new int[5][];
multi[0] = new int[10];
multi[1] = new int[10];
multi[2] = new int[10];
multi[3] = new int[10];
multi[4] = new int[10];
Обратите внимание, что каждый элемент будет инициализирован по умолчанию значение для int
, 0
, поэтому вышеупомянутые также эквивалентны:
int[][] multi = new int[][]{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
int rows = 5;
int cols = 10;
int[] multD = new int[rows * cols];
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < cols; c++)
{
int index = r * cols + c;
multD[index] = index * 2;
}
}
Наслаждайтесь!
int [][] twoDim = new int [5][5];
int a = (twoDim.length);//5
int b = (twoDim[0].length);//5
for(int i = 0; i < a; i++){ // 1 2 3 4 5
for(int j = 0; j <b; j++) { // 1 2 3 4 5
int x = (i+1)*(j+1);
twoDim[i][j] = x;
if (x<10) {
System.out.print(" " + x + " ");
} else {
System.out.print(x + " ");
}
}//end of for J
System.out.println();
}//end of for i
Мы можем объявить двухмерный массив и непосредственно хранить элементы во время его объявления как:
int marks[][]={{50,60,55,67,70},{62,65,70,70,81},{72,66,77,80,69}};
Здесь int представляет собой элементы целочисленного типа, хранящиеся в массиве, и имя массива - «метки». int является типом данных для всех элементов, представленных внутри скобок «{» и «}», потому что массив представляет собой набор элементов, имеющих один и тот же тип данных.
Возвращаясь к нашему заявлению, написанному выше: каждая строка элементов должна быть записана внутри фигурных скобок. Строки и элементы в каждой строке должны быть разделены запятыми.
Теперь посмотрите на инструкцию: вы можете получить 3 строки и 5 столбцов, поэтому JVM создает 3 * 5 = 15 блоков памяти , Эти блоки могут быть индивидуально обозначены как:
marks[0][0] marks[0][1] marks[0][2] marks[0][3] marks[0][4]
marks[1][0] marks[1][1] marks[1][2] marks[1][3] marks[1][4]
marks[2][0] marks[2][1] marks[2][2] marks[2][3] marks[2][4]
ПРИМЕЧАНИЕ. Если вы хотите сохранить элементы n , то индекс массива начинается с нуля и заканчивается на n- 1 . Другой способ создания двумерного массива состоит в том, чтобы сначала объявить массив, а затем выделить для него память, используя новый оператор.
int marks[][]; // declare marks array
marks = new int[3][5]; // allocate memory for storing 15 elements
Объединив два выше, мы можем написать:
int marks[][] = new int[3][5];
Наиболее распространенная идиома для создания двумерного массива с 5 строками и 10 столбцами:
int[][] multD = new int[5][10];
В качестве альтернативы вы можете использовать следующее, которое больше похоже на то, что у вас есть, хотя вам нужно явно инициализировать каждую строку:
int[][] multD = new int[5][];
for (int i = 0; i < 5; i++) {
multD[i] = new int[10];
}
Object[][] ary2d = new Object[5][10];
, вы все равно должны инициализировать каждый элемент 2D-массива.
– Armand
5 March 2014 в 02:28
null
безопасно для любых не примитивов. Независимо от того, нужно ли инициализировать каждый элемент, вы полностью зависите от своего дизайна. Кроме того, просто для уточнения - примитивы не могут быть нулевыми и получать экземпляр к определенному значению по умолчанию, если оно не назначено вами. Например. int
не может быть нулевым, и если вы скажете int i;
без присвоения значения, используется значение по умолчанию для 0
. Читайте об этом здесь
– indivisible
3 May 2014 в 06:21
Эти типы массивов называются зубчатыми массивами в Java:
int[][] multD = new int[3][];
multD[0] = new int[3];
multD[1] = new int[2];
multD[2] = new int[5];
В этом сценарии каждая строка массива содержит различное количество столбцов. В приведенном выше примере первая строка будет содержать три столбца, вторая строка будет содержать два столбца, а третья строка содержит пять столбцов. Вы можете инициализировать этот массив во время компиляции, как показано ниже:
int[][] multD = {{2, 4, 1}, {6, 8}, {7, 3, 6, 5, 1}};
Вы можете легко перебирать все элементы в вашем массиве:
for (int i = 0; i<multD.length; i++) {
for (int j = 0; j<multD[i].length; j++) {
System.out.print(multD[i][j] + "\t");
}
System.out.println();
}
int array[][] = new int[3][];
VS int array[][] = new int[][3];
?? который является законным, поскольку я читал обе версии где-то.
– roottraveller
13 June 2017 в 09:39
new int[][]
в=new int[][]{...}
варианте? Можем ли мы написать={...}
? – Nawaz 25 May 2017 в 07:56new
. – roottraveller 13 June 2017 в 09:40