Контакты

Достижения

Все достижения (6)

Наибольший вклад в теги

Все теги (87)

Лучшие ответы пользователя

Все ответы (263)
  • Можно ли на C заменить X[i][j] на *((X+i)+j)?

    wisgest
    @wisgest
    Не ИТ-специалист
    Нет, пропущен один знак *: в Си X[i][j]можно заменить на *(*(X + i) + j) (а также на *(X[i] + j) или (*(X + i))[j]).
    При этом X может быть (в скобках указано в каких случаях уместна запись X[i][j]):
    a) массивом массивов;
    b) указателем на массив (являющегося 0-й элементом динамического массива массивов);
    c) массивом указателей (на 0-е элементы динамических массивов);
    d) указателем на указатель (на 0-й элемент динамического массива указателей на 0-е элементы динамических массивов).

    Пример
    #define TElem int
    #define M 2
    #define N 3
    
    TElem a[M][N]               // массив массивов
    	 = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    TElem (*b)[N] = &a[0];      // указатель на массив
    /*                                       // то же самое,
    TElem (*b)[N] = a;              // но короче
    */
    TElem *c[M] = {a[0], a[1]}; // массив указателей
    TElem **d = &c;             // указатель на указатель
    
    #include <stdio.h>
    int main(void) {
    	TElem x;
    	#define i 1
    	#define j 2
    
    	puts("X[i][j]");
    	x = a[i][j];  printf("%d\n", x);
    	x = b[i][j];  printf("%d\n", x);
    	x = c[i][j];  printf("%d\n", x);
    	x = d[i][j];  printf("%d\n", x);
    
    	puts("(*(X + i))[j]");
    	x = (*(a + i))[j];  printf("%d\n", x);
    	x = (*(b + i))[j];  printf("%d\n", x);
    	x = (*(c + i))[j];  printf("%d\n", x);
    	x = (*(d + i))[j];  printf("%d\n", x);
    
    	puts("*(X[i] + j)");
    	x = *(a[i] + j);  printf("%d\n", x);
    	x = *(b[i] + j);  printf("%d\n", x);
    	x = *(c[i] + j);  printf("%d\n", x);
    	x = *(d[i] + j);  printf("%d\n", x);
    
    	puts("*(*(X + i) + j)");
    	x = *(*(a + i) + j);  printf("%d\n", x);
    	x = *(*(b + i) + j);  printf("%d\n", x);
    	x = *(*(c + i) + j);  printf("%d\n", x);
    	x = *(*(d + i) + j);  printf("%d\n", x);
    
    	return 0;
    }
    Ответ написан
    Комментировать
  • Столкнулся со странным утверждением в книге по C. Так какой же адрес у переменной массива?

    wisgest
    @wisgest
    Не ИТ-специалист
    array == &array[0]
    &array численно равен array, но имеет другой тип.
    Ответ написан
    Комментировать
  • Как переименовать все файлы в нижний регистр с помощью cmd?

    wisgest
    @wisgest
    Не ИТ-специалист
    Уточнение про NTFS и FAT32 (добавлено 2022-12-26)
    Условный
    for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

    поэтому не срабатывает.

    Если бы это совсем не срабатывало, то вряд ли было бы выбрано лучшим ответом на соответствующий вопрос на Super User. У меня это срабатывает на NTFS, а вот на FAT32 (проверялось на съёмном USB-накопителе) — нет. Более того, на FAT32, если имя файла укладывается в формат 8.3, при попытке переименования (не обязательно с помощью CMD.EXE, можно и в Проводнике…), меняющем только регистр символов, все символы переводятся в верхний регистр!

    Вручную приходится делать Abc.jpg -> 1Abc.jpg -> abc.jpg

    Так что мешает делать это не вручную?
    Например, в теле цикла
    (ren "%f" "to_lower_%f" && ren "to_lower_%f" "%f")
    При этом, правда, будут впустую переименовываться туда-сюда файлы с именами уже в нижнем регистре. Чтобы этого избежать можно добавить перед телом цикла проверку for %g in ("%~nxf") do if not "%f"==%g:
    for /f "delims=" %f in ('dir /l/b/a-d') do  for %g in ("%~nxf") do  if not "%f"==%g  (ren "%f" "to_lower_%f" && ren "to_lower_%f" "%f")

    Прежний совет (до правки 2022-12-25)
    …Чтобы этого избежать можно сделать в командном файле так:
    for /f "delims=" %%f in ('dir /l/b/a-d') do  for %%g in ("%%f*") do (
    	if /i "%%f"=="%%g"  if not "%%f"=="%%g" (
    		ren "%%f" "to_lower_%%f" && ren "to_lower_%%f" "%%f"
    	)
    )

    И ещё: если обрабатываемая папка открыта в Проводнике, то, скорее всего (наблюдалось в случае NTFS), чтобы увидеть изменение регистра имён файлов, надо будет обновить содержимое окна.
    Ответ написан