Показать данные / адрес памяти указателей в C

Я немного изучаю C, и после урока у меня возник вопрос: первый пример, который я увидел с указателями, выглядит примерно так:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int n = 5;
int *p_n;

p_n = &n;
printf("Numero: %i", *p_n);

printf("Direccion: %p", p_n);
return 0;

Первый printf печатает число, а второй адрес, поэтому Это были, как я понял, указатели, с * печатью значения и без * печати адреса. Но позже в этом курсе выполняется несколько более сложное упражнение:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char nombre[20], *p_nombre;
int longitud;

strcpy(nombre,"Alejandro");
longitud = strlen(nombre);
p_nombre = malloc((longitud+1)*sizeof(char));
strcpy(p_nombre,nombre);
printf("Nombre: %s",p_nombre);

return 0;

}

, а здесь все наоборот: без * в printf выведите имя и с * напечатайте адрес памяти, который Это заставляет меня сомневаться, я не понимаю, почему это так, или если есть что-то, я не до конца понимаю, как отображаются данные и когда адрес памяти, я не должен печатать адрес памяти за отсутствие *? привет.

1
задан 30.11.2019, 04:38
2 ответа

как дела? Различие между одним и другой состоит в том, что в первом примере ты используешь int, и в другом векторе char (или String), я перехожу к тому, чтобы объяснять тебе потому что:

Пример 1)

, создав переменную типа int так называемая n, ты создаешь контейнер в памяти, которая хранит стоимость, давайте использовать тот же пример и давайте использовать номер 5. Создав указатель, который указывает на int так называемый p_n (для того, чтобы меткая заметка нужна распределять ему память переменной, на которую он указывает), для этого мы используем следующую линию:

p_n = &n;

Это хранит адрес n в изменчивая меткий тип в int p_n.

, Когда мы используем

printf("%d",n);

, мы перемещаем его контент n, что в нашем случае был бы номером 5.

2), использовав

printf("%p",p_n);

также, мы перемещаем его контент p_n, но в этом случае контент p_n - адрес n, поэтому печатает адрес памяти.

3), использовав

printf("%d",*p_n);

, мы просим перемещая его указанное из-за p_n, а именно, контент того, что содержит ее direcciГіn памяти, хранившейся в p_n (в этом случае, как он считает хранившимся адрес n, мы просим контент n).

Пример 2)

В случае векторов, оно функционирует немного различно.

, объявив вектор, (в этом случае вектор char или String), имя вектора содержит ее direcciГіn первого элемента того же самого (в этом случае адрес в память первого характера), и, как для того, чтобы printf он напечатал String, нужно перемещать его адрес памяти начала вектора, перемещают его только имя String.

printf("%s",nombre);

ВїComo знает printf, когда он должен прекращать читать символы? из-за \0, которые он размещает себе в конце каждого String.

Надеялся, что ты понял, так как он немного обременительный, объяснять довольно меткие в простом тексте.

типов Привета!

1
ответ дан 01.12.2019, 10:33

... и с * напечатай ее direcciГіn памяти.

Полностью фальшивые . Оператор * всегда indirecciona указатель. И в твоем втором примере, вышеупомянутый оператор не появляется .

Ты comprensiГіn указателей - правильные . То, что не estГЎs понимая является тем, что ждет printf( ).

В твоем первом примере:

...
printf("Numero: %i", *p_n);
...
printf("Direccion: %p", p_n);
...

SegГєn documentaciГіn printf( ), especificador от формата %i ждет стоимость типа int. Из-за этого, так как у нас есть указатель, есть, что indireccionarlo, чтобы получать стоимость, на которую он указывает. ahГ - *p_n.

Однако, %p ждет указатель . Не необходимо ничего не делать, так как p_n - именно это, указатель.

В твоем втором примере:

printf("Nombre: %s",p_nombre);

especificador формата %s, как уже habrГЎs угаданный, надеется указатель . И из-за этого, также не является необходимым indireccionar ничто: мы перемещаем его указатель такие каковы .

1
ответ дан 01.12.2019, 10:33