Я немного изучаю 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 выведите имя и с * напечатайте адрес памяти, который Это заставляет меня сомневаться, я не понимаю, почему это так, или если есть что-то, я не до конца понимаю, как отображаются данные и когда адрес памяти, я не должен печатать адрес памяти за отсутствие *? привет.
как дела? Различие между одним и другой состоит в том, что в первом примере ты используешь 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.
Надеялся, что ты понял, так как он немного обременительный, объяснять довольно меткие в простом тексте.
типов Привета!
... и с * напечатай ее 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 ничто: мы перемещаем его указатель такие каковы .