Когда я познакомился с указателями, мне сказали, что они полезны, потому что они позволяют нам изменять определенные переменные, передаваемые в функции, которые обычно не могут быть изменены.Например:
void copy(int *p, int *s);
int main(){
int a = 4, b = 10, *p = &a, *s = &b;
copy(p, s);
}
void copy(int *p, int *s){
*s = *p;
*p = 0;
}
Таким образом, в конце этого «b» равно «a», а «a» равно 0, хотя «a» и «b» не будутобычно может быть изменяемым.
Говоря о списках и, в частности, добавляя элемент в список, я могу использовать такую функцию:
struct list{
int n;
struct list *next;
}
struct list *first = NULL;
int main(){
int n = 3;
first = add_to_list(first, n);
}
struct list *add_to_list(struct list *first, int n){
struct list *new_node;
new_node = malloc(sizeof(struct list));
if(new_node == NULL) exit(EXIT_FAILURE);
new_node->value = n;
new_node->next = first;
return new_node;
}
Что меня особенно беспокоит, так это почему функцияя не могу просто вернуть тип void, и вместо записи "return new_node" я не могу просто написать "first = new_node" .Поскольку сначала указатель, если я изменю его где-нибудь в моей программе, исходный указатель тоже должен быть изменен, точно так же, как это произошло в первом примере, который я сделал, верно?
Кроме того, немного не связанный вопрос, ноесли у меня есть такая функция:
void first_to_n(int a[], int n){
a[0] = n;
}
Первый элемент исходного вектора a, который, скажем, объявлен в main, тоже модифицируется, верно?Потому что векторы можно рассматривать как указатели