Можете ли вы идти в ногу с игрой 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] просто означает, что программа получает элемент, адрес которого является результатом сложения начального адреса памяти этого массива плюс умножение желаемого элемента индекса на количество места (в битах), которое он занимает в памяти.