经测试,以下三种写法都可以正常编译。
int*a;
int* a;
int *a;
作用是创建一个int型指针变量,a是指针变量。它是被指变量的快捷方式,而不是一份复制品。
指针a是空的所以不能对*a进行操作,比如:
int* a;
*a = 1;
这是不对的,因为*a相当于一个被指针a指着的int变量,但是指针a没有指向任何变量,所以不能被赋值。会报code=3221225477。
同理,
int *a;
int b = 1;
*a = b;
也是不对的。
正确的做法是
int *a;
int b;
a=&b;
指针a就指向b了,此时再
int *a;
int b;
int c = 8;
a = &b;
*a = 3;
*a = c;
就不会报错了。
对于函数的引用,比如
void insert(list &l, int index, int value){
...
}
insert(list, 0, 1)
我更趋向于理解成定义了一个指针(比如list* a),让指针a指向传入的list(a=&list),而函数里的l相当于*a。
以下是一个不带头节点,也不判断是否是第一个元素,的单链表插入函数。是最近看数据结构的产物,也是趋势我仔细看看指针的原因。
void linked_list_insert(linked_list &l, int index, int value){
int current_index = 0;
linked_list* current_node;
current_node = &l;
//找到index对应的节点
while(current_index < index && current_node != NULL){
current_node = &((*current_node) -> next_node);
current_index += 1;
}
//断言找到index
if(index != current_index){
throw invalid_argument("Index Erro");
}
//判断有无后驱
node* next_node;
if(*current_node == NULL){
next_node = NULL;
}
else{
next_node = (*current_node) -> next_node;
}
//构建新节点
node* new_node = (node*)malloc(sizeof(node));
new_node->value=value;
new_node->next_node=next_node;
*current_node = new_node;
}