Я пытаюсь понять, почему оба :
#include <unistd.h>
int main()
{
char buffer[8] = "Hello \n";
write(1, buffer, 7);
return 0;
}
и
#include <unistd.h>
int main()
{
char buffer[8];
char *ptr = buffer;
ptr = "Hello \n";
write(1, ptr, 7);
return 0;
}
успешно выводит "Hello " на консоль, но
#include <unistd.h>
int main()
{
char buffer[8];
char *ptr = buffer;
ptr = "Hello \n";
write(1, buffer, 7);
retrun 0;
}
нет (вместо этого выводит тарабарщину), когда я ожидаю, что все три будут по существу одинаковыми.
Я предполагаю, что в моем понимании отношений между указателями и массивами в c
...
Указатель хранит адрес некоторой памяти. Изменение указателя не меняет содержимого того, на что он указывал. Просто указывает куда-то еще. Таким образом, в последних двух примерах указатель изменяется с указателя на память
buffer
на строковый литерал. Исходное содержимоеbuffer
не изменилось.buffer
иptr
— это две разные переменные (с разными типами для загрузки). Если у вас есть две переменныеint
, присвоение значения одной из них не повлияет на другую.Переменная-указатель может использоваться для воздействия на значение объекта, на который указывает указатель, но вы должны разыменовать указатель для обращения к объекту, на который указывает ссылка.