地址和指针
地址
在C++中使用‘&’表示变量的地址,即 0x00bf528
这样的地址标识符,初始化后地址将不再发生变化。
‘&’还表示引用。 关于引用的用法这里没有详细列出。
举个栗子!
//创建变量a以后再输出变量a的地址,无论什么时候输出都将不会发生变化只是对地址存储的内容进行了修改。
int a = 5;
cout<< a << &a <<endl;
a = 6;
cout<< a << &a <<endl;
指针
指针使用‘*’表示,是用来存储地址信息的变量。同样正常情况下将一个声明赋值给一个指针变量,声明后的地址将不会发生变化。除非使用new来初始化变量。
使用new初始化后的变量要在使用完后使用delete
进行内存释放
举个栗子!
int a = 0;
int i = 0;
while(a != 0){
i = i + 1;
int temp = a + i;
// 每次循环只是改变了temp 的值并没有分配新的内存
cout<< temp << &temp<<endl;
}
以上例子在实际使用过程中较好理解,也并不会产生什么错误和歧义,但是在一些类似链表的数据结构中容易出现一些逻辑上的错误。
/*
* 此处l1是 7-> 5 -> 9 这样的链表
*/
ListNode *ResHead =new ListNode();
ListNode *lr =ResHead;
int temp = 0;
//第一种写法
while(l1 != nullptr){
int num = l1->val + temp;
temp = num/10;
num = num %10;
// 这里在循环过程中ltemp 只是存储了第一次初始化的地址,在循环过程中在
//不断反复覆盖掉过去地址中存储的ListNode的值
ListNode *ltemp = &ListNode(num);
lr->next = ltemp;
l1 = l1->next;
lr = lr->next;
}
// 第二种写法
while(l1 != nullptr){
int num = l1->val + temp;
temp = num/10;
num = num %10;
//这里在循环过程中创建了新的地址来存储新的ListNode的值,因此循环后可以延长lr 而不是陷入循环。
ListNode *ltemp = new ListNode(num);
lr->next = ltemp;
l1 = l1->next;
lr = lr->next;
}
//以上代码为力扣 两数相加 的部分代码,感兴趣可以自己搜索练习
以上栗子可以在vscode 中运行一下来感受地址和指针的区别,以及使用new和普通的&声明新的变量的区别。