2-мерный массив в указателях

0
#include<stdio.h>
void main()
{
    int a[] = { 1, 2, 3, 4 };
    int b[] = { 5, 6, 7 };
    int *p[2];
    p[0] = a;
    p[1] = &b + 1;
    printf("%d\n%d", &p[1][0], p[0][1]);
}

Здесь p представляет собой 1d массив указателей, то почему массив 2d используется в инструкции printf. Также выход равен 1 2.

  • 1
    Вы можете применить operator[] к указателю. Это не значит, что указатель является массивом.
  • 0
    что такое p [0] [0] означает p это 1d массив
Показать ещё 7 комментариев
Теги:
pointers

2 ответа

0
Лучший ответ

Индексный оператор [] определен для выражений указателя, а также выражений массива (которые неявно преобразуются в выражения указателя до применения индекса).

Выражение a[i] оценивается как *(a + i); a - указатель, a + i - адрес i -го элемента массива (арифметика указателя основана на указанном типе; если a указывает на int, то a + i задает адрес i 'th int следуя указанию a).

Поэтому, учитывая ваш массив указателей:

int *p[2];

выражение p[0] имеет тип указателя, поэтому вы можете добавить смещение и разыменовать результат: *(p[0] + 1), что совпадает с записью p[0][1].

2

Здесь p является 1darray указателей

Да, и вы можете использовать ptr[index] оператор ptr[index] с указателями, который эквивалентен *(ptr + index)

Таким образом, p[1][0] совпадает с *(p[1] + 0) который совпадает с *(p[1])

Также ваш код не компилируется по нескольким причинам, включая void main()


Простой пример для иллюстрации:

int main()
{
  const char *hello = "hello";
  const char *world = "world";

  const char *array[2] = {hello, world};

  char e = hello[1]; // char e now contains 'e'
  e = array[0][1]; // same thing as previous line

  char r = world[2]; // char r now contains 'r'
  r = array[1][2]; // same thing as previous line
}
  • 0
    но p [1] [1] равно * (p [1] + 1)
  • 0
    тогда также выводится 2
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню