Массивы, распадающиеся на указатели

Пожалуйста, помогите мне понять программы ниже.

#include int main() { int a[7]; a[0] = 1976; a[1] = 1984; printf("memory location of a: %p", a); printf("value at memory location %p is %d", a, *a); printf("value at memory location %p is %d", &a[1], a[1]); return 0; } 

&a[1] и &a+1 . Они такие же или разные?

 #include  int main() { int v[10]; int **p; int *a[5]; v[0] = 1234; v[1] = 5678; a[0] = v; a[1] = v+1; printf("%d\t%d\t%d\t%d\n", *a[0],*a[1],a[0][0],**a); printf("%d\n", sizeof(v)); return 0; } 

Я хотел знать, как *a[5] представлен в памяти. Является базовым указателем, который указывает на a[0],a[1],a[2],a[3],a[4] ?

 #include int main() { int v[10]; int **p; int (*a)[10]; a=&v; printf("%d\n",*a); return 0; } 

a=v; // gives error why? здесь v распадается на *v . Тогда &v распадается на (*)[]v ? & означает константный указатель. Здесь, как можно установить указатель константы на указатель не-const без typecast?

Где массив хранится в памяти. Он хранится в сегменте данных памяти.

 #include int main() { int carray[5]={1,2,3,4,5}; printf("%d\n",carray[0]); printf("%d\t%d\t%d\n",sizeof(carray),sizeof(&carray),sizeof(&carray[0])); return 0; } 

Редакция:

Я просмотрел некоторые статьи, в которых говорилось, что единственными возможными случаями, когда имя массива не может быть записано в указатель, является sizeof и & . Но в вышеуказанной программе sizeof(&carray) дает размер как 4. и &carray распадается на (*)[]carray как его rvalue.

Тогда утверждение о том, что имя массива не может быть разложено в указатели на двух условиях sizeof и & становится ложным здесь.

&a[1] и &a+1 . Они такие же или разные?

Другой. &a[1] совпадает с (a+1) . В общем случае x[y] по определению эквивалентно *(x+y) .

Я хотел знать, как *a[5] представлен в памяти. Обозначает ли *a базовый указатель, который указывает на a[0],a[1],a[2],a[3],a[4] .

В вашем втором примере a представляет собой массив указателей. *a[i] – значение объекта, адрес которого хранится как i- й элемент в вашем массиве. *a в этом случае совпадает a[0] , который является первым элементом в вашем массиве (который является указателем).

a=v //why this gives error

Потому a (в вашем последнем примере) является указателем на массив. Вы хотите назначить a , тогда вам нужно назначить адрес массива v (или любого другого массива с правильными размерами);

 a = &v; 

Это очень хорошо, что вы приступили к пониманию вещей, но ничто не поможет вам лучше, чем хорошая книга C.

Надеюсь это поможет.

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

 int *a and int a[] 

является объявлением массива, единственное отличие состоит в том, что в [] вам нужно объявить свой постоянный размер, * a дает вам гибкость, он может указывать на размер массива от 1 до бесконечности

 int *a[] and int **a 

является объявлением массива Array, иногда называемого Matrix, единственное отличие состоит в том, что в * a [] вам нужно объявить, сколько массивов будет содержать указатели, ** a дает вам гибкость, он может указывать на любой массив массивов, к которому вы хотите привязать его.

В общем: добавив & к переменной, добавив * к ее определению типа:

int a;

& a -> & (int) = int *

при добавлении * к переменной вы деактируете * из своего определения типа

int * a;

* a -> * (int *) = int

 int *a; &a - the Address given to the pointer a by the system(pointer of pointer = **a) &a+1 - the Address to the beginning of the array + 1 byte &a[1] == &(a+1) - the Address to the beginning of the array + 1 size of int int **a; *a == a[0] - the Address of the first Array in the array of arrays a *a[0]==a[0][0] - the first int of first array int *a, b[5]; *a=*b - ERROR because a points at garbage to begin with a=b - a points at array b 

спросите меня, что еще вы хотите знать, и плохо отредактируйте этот ответ.

& a [1] и & a + 1. Они такие же или разные?

Не они не являются, первое относится ко второму целому числу в массиве с именем a, второе относится к целому числу, построенному из байтов sizeof (int), начинающихся с местоположения памяти в + 1 байт.

Я хотел знать, как * a [5] представлен в памяти. D * – это базовый указатель, который указывает на [0], a [1], a [2], a [3], a [4].

a теперь является указателем на расположение первого элемента в массиве, который вы объявили в стеке размером 5. & a указывает на то же, что и & a [0]; & a [1] указывает на & a + sizeof (int).

а = v; // дает ошибку, почему? здесь v распадается на * v.

Это дает вам ошибку, потому что a – указатель на массив, а v – массив. Поэтому вы должны присвоить адрес v (& v) a.

здесь v распадается на * v

Массив никогда не распадается на его первый элемент. Никогда. v может распадаться на &v[0] (что совпадает с &*v ), но никогда не будет v[0] (или *v , что то же самое)

  • C - передача массива 2d в качестве аргумента функции?
  • Что означает ... означает в списке аргументов в C?
  • Передача многомерных массивов в качестве аргументов функции в C
  • Почему запись в строковый литерал в этой программе C segfault?
  • возвращает указатель на литеральный (или постоянный) массив символов (строка)?
  • Проблема с поплавком на C
  • Правильный способ передачи 2-мерного массива в функцию
  • Переменные стека против переменных кучи
  • интеграция пружин + cron + кварц в кластере?
  • Что случилось с этим кодом C 1988 года?
  • Как определить результат назначения многосимвольной константы символов переменной char?
  • Давайте будем гением компьютера.