为什么同一指针的地址不同?



我在c++上尝试链表,当我尝试打印列表的数据时,它给出了有趣的结果,告诉我列表是空的。当我在main中打印变量的地址和在函数中打印相同变量的参数的地址时,它给出了不同的结果。谁能给我解释一下,谢谢!下面是代码:

#include <iostream>
using namespace std;
typedef struct link_node{
int data;
link_node* next;
};
void iter(link_node* head){
link_node* cur = head;
cout<<"The address of head in function: "<<&head<<endl;
while(cur!=NULL){
cur = cur->next;
cout<<cur->data<<' ';        
}
}
link_node *create(int a){
link_node* head;
link_node* cur;
head =(link_node*) malloc(sizeof(link_node));
cur = head;
for(int i=a;i<a+10;i+=2){
link_node * node = (link_node*) malloc(sizeof(link_node));
node->data = i;
cur->next = node;
cur = node;
}
cur->next = NULL;
return head;
}
int main(){
link_node* head_1 = create(0);
link_node* head_2 = create(1);
link_node* result = (link_node*) malloc(sizeof(link_node));
cout<<"The address of head_1: "<<&head_1<<endl;
iter(head_1);
return 0;    
}

程序的输出如下:

The address of head_1: 0x61ff04
The address of head in function: 0x61fef0
0 2 4 6 8

谢谢!

headhead_1是两个不同的变量,所以它们有两个不同的地址。但是这些变量中也有地址(或指针),它们的值是相同的。

在处理指针时,很容易混淆变量的地址和变量的值,因为它们都是指针(但指针类型不同)。

换句话说,所有变量都有地址,但只有指针变量的值也是地址。

试试这段代码

cout<<"The value of the head pointer: "<<head<<endl;
cout<<"The value of the head_1 pointer: "<<head_1<<endl;

head为变量,head_1为另一个变量。这些变量都位于内存中的不同位置。您正在打印它们所在的位置。

这两个变量恰好都是指针类型,并且这些变量的有效载荷将是相同的(链表头的地址)。但是,您打印出来的变量的实际位置将是不同的。

函数参数按值传递,即复制。只有当你声明实参为引用时,才传递引用(即没有副本)。

考虑下面的例子:

#include <iostream>

void foo(int* a) {
std::cout << "value of a:    " << a << "n";
std::cout << "address of a:  " << &a << "n";
std::cout << "a dereference: " << *a << "n";
}
void bar(int* const& b) {
std::cout << "value of b:    " << b << "n";
std::cout << "address of b:  " << &b << "n";
std::cout << "b dereference: " << *b << "n";
}

int main(){
int x = 42;
int* ptr = &x;
std::cout << "value of ptr:    " << ptr << "n";
std::cout << "address of ptr:  " << &ptr << "n";
std::cout << "ptr dereference: " << *ptr << "n";

foo(ptr);
bar(ptr);
}

可能的输出:

value of ptr:    0x7fff77c582cc
address of ptr:  0x7fff77c582c0
ptr dereference: 42
value of a:    0x7fff77c582cc
address of a:  0x7fff77c582a8
a dereference: 42
value of b:    0x7fff77c582cc
address of b:  0x7fff77c582c0
b dereference: 42

ptr,ab都指向同一个int。它们都有相同的值。对它们解引用会得到相同的int,即值为42x。然而,aptr的副本,并且存储在不同的地址。因为b是通过引用传递的,取其地址就会得到ptr的地址。

相关内容

  • 没有找到相关文章

最新更新