Я просматриваю свои навыки C, и я изо всех сил пытаюсь понять некоторые бит. Вот мое понимание С и указателей.Понимать указатели в C
Каждый раз, когда я объявляю переменную, C сохраняет значение в памяти.
int num = 12; // The 12 is stored somewhere in memory, let's say has address 0x54
Чтобы получить адрес памяти переменной «NUM» мы делаем:
printf("%p", &num); // this returns the 0x54
, если я хочу, чтобы создать указатель, который указывает на то же значение «Num», я:
int *ptr = # // create a pointer and point him to 0x54
Если я проверить как адрес:
После этого ... Я не понимаю выход моей программы. Я читаю это book, и автор говорит, что мы можем рассматривать указатели как массивы и наоборот (за исключением некоторых случаев [если я правильно понял]).
int ages[] = { 23, 43, 12, 89, 2 };
printf("1-%d\n", ages[0]);
printf("1-%d\n", ages[1]);
printf("2-%p\n", &ages[0]);
printf("2-%p\n", ages);
printf("2-%p\n", &ages);
printf("3-%d\n", *(&ages[1]));
printf("4-%p\n", *(&ages));
printf("5-%p\n", &ages[1]);
printf("6-%p\n", &ages+1);
printf("7-%d\n", *(*(&ages)+1));
printf("8-%ld\n", sizeof(1));
Выходные вопросы в комментариях:
1-23 // value of position 0, OK
1-43 // value of position 1, OK
2-0x7fff1fd500f0 // adress of the beginning of array, OK
2-0x7fff1fd500f0 // same as above, OK
2-0x7fff1fd500f0 // because ages is not a pointer, same as above, OK
3-43 // get address of ages, advance 4 bytes and then give me the value that is in that address, OK
4-0x7fff1fd500f0 // give me the address of ages, and then give the value that is in that address. The address I have in the print number 2, why doesn't return the value and show me the address? **NOT OK**
5-0x7fff1fd500f4 // give me the address of the position 1 of the array, the address that contains the number 43, OK
6-0x7fff1fd50104 // why I don't get the same number of the print 5? How I jump from f0 to 104? **NOT OK**
7-43 // why I need pointer of pointer, **NOT OK**
8-4 // this was just trying to understand print 6, OK
Может кто-нибудь объяснить мне печатает 4, 6 и 7, и дайте мне знать, если я правильно думать о других печатных изданий.
Если кто-то говорит вам, что массивы и указатели одинаковы, убегайте. C11 draft standard n1570: * 6.3 Конверсии 6.3.2.1 Lvalues, массивы и указатели функций 3 За исключением случаев, когда это операнд оператора sizeof, оператор _Alignof или оператор унарного оператора или является строковым литералом, используемым для инициализации array, выражение, которое имеет type '' array of type '', преобразуется в выражение с типом '' указателем на тип '', которое указывает на начальный элемент объекта массива и не является значением lvalue. Если объект массива имеет класс хранения , поведение не определено. * – EOF
Если вы понимаете 'printf (" 2-% p \ n ", &ages);', то я не совсем понимаю, что путает насчет остальных. –
Просто Нет. Когда-то переменные массива/структуры рассматривались как указатели и наоборот. Это привело к множеству проблем. Смущение, которое у вас есть, - это то, что было у большинства других людей в то время и было причиной этих проблем. – Ouroborus