Можете ли вы идти в ногу с игрой C?

Давайте немного поиграем с C; что вы думаете о следующем заявлении?

x[0] != x[0][0] != x[0][0][0]

Для начала, чтобы понять это, давайте рассмотрим следующие примеры, которые дополнительно иллюстрируют взаимосвязь между указателями и массивами:

x = [1, 2, 3, 4, 5, 6, 7]

Теперь мы знаем, что:

x[0] = 1

А также, что x возвращает адрес памяти первого элемента в массиве, как показано ниже:

Таким образом, мы получили следующую информацию, из которой мы можем определить значение:

x[0][0][0]

Это возможно благодаря:

1. x --> x points to an array of pointers that point to an int
2. x[0] --> x[0] is an array of pointers that point to an int
3. x[0][0] --> x[0][0] is a pointer that point to an int
4. x[0][0][0] --> x[0][0][0] hold the value of the int

И, если сделать в обратном порядке, мы также можем вывести следующее:

1. x == &x[0] // returns True
2. x[0] == *x // returns True
3. Following (2)'s logic, we get that x[1] = * (x + 1)

В конце концов, массивы во многом похожи на указатели. Фактически, x [1] просто означает, что, зная значение адреса памяти первого элемента массива x, x [1] просто означает, что программа получает элемент, адрес которого является результатом сложения начального адреса памяти этого массива плюс умножение желаемого элемента индекса на количество места (в битах), которое он занимает в памяти.