有人能解释为什么指针的地址在被另一个函数调用时会改变吗?如何使nPtr=Ptr



我注意到,当指针地址传递给函数时,指针地址是不同的。是否确定
访问函数中存在的值?请不要建议从函数中返回指针
值。我严格希望使用void函数

输出:
&nPtr=6422300
&Ptr=6422272
&nPtr=66422300

请参阅以下代码:

#include<stdio.h>
void myFunc(int *Ptr){
printf("&Ptr = %dn", &Ptr);
};
void main(){
int *nPtr;
printf("&nPtr = %dn", &nPtr);
myFunc(nPtr);
printf("&nPtr = %dn", &nPtr);
}

让我更清楚一点。这是我试图修复的代码。我只想让两个指针指向同一个地址。我想
使用最佳编码实践

#include<stdlib.h>
#include<stdio.h>
void myFunc(int *Ptr){
Ptr = malloc(10*sizeof(int));
printf("*Ptr = %dn", *Ptr);
};
void main(){

int *nPtr;
printf("*nPtr = %dn", *nPtr);

myFunc(nPtr);
printf("*nPtr = %dn", *nPtr);
}

main()中,您将在main()的堆栈帧中获得nPtr的地址;在myFunc()中,您得到的是nPtr的副本的地址,该副本通过值传递给myFunc()作为Ptr(因此您实际上得到的是不同的Ptr的地址(,并且存在于myFunc()的堆栈帧上。

nPtrPtr是独立函数中的独立变量,因此每个变量必须具有不同的地址,即&nPtr == &Ptr将始终为false。

但您询问了nPtr == Ptr,即它们是否可以包含相同的,并且作为指针,它们都可以包含相同指针值。例如:

#include<stdio.h>
void myFunc(int *Ptr){
printf("Ptr = %pn", (void *)Ptr);
};
int main(){
int x;
int *nPtr = &x;
printf("nPtr = %pn", (void *)nPtr);
myFunc(nPtr);
printf("nPtr = %pn", (void *)nPtr);
}

输出:

nPtr = 0x7ffe9a615104
Ptr = 0x7ffe9a615104
nPtr = 0x7ffe9a615104

对于此函数

void myFunc(int *Ptr){
printf("&Ptr = %dn", &Ptr);
};

当您调用它时,尽管您将一个指针(用于指向整数(传递给该函数,但系统正在创建指针的副本,当然它们将位于不同的内存地址。

因此,当您返回到主目录并检索您的原始指针地址时,它将显示回原始地址