Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有人能解释为什么指针的地址在被另一个函数调用时会发生变化吗?如何使nPtr=Ptr?_C - Fatal编程技术网

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

C 有人能解释为什么指针的地址在被另一个函数调用时会发生变化吗?如何使nPtr=Ptr?,c,C,我注意到我的指针地址在传递给函数时是不同的。您不确定是否访问函数中存在的值?请不要建议从函数返回指针值。我严格地想使用void函数 输出: &nPtr=6422300 &Ptr=6422272 &nPtr=6422300 请参阅以下代码: #include<stdio.h> void myFunc(int *Ptr){ printf("&Ptr = %d\n", &Ptr); }; void main(){ int *nPt

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

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

请参阅以下代码:

#include<stdio.h>

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

void main(){
    int *nPtr;
    printf("&nPtr = %d\n", &nPtr);
    myFunc(nPtr);
    printf("&nPtr = %d\n", &nPtr);
}
#包括
无效myFunc(int*Ptr){
printf(“&Ptr=%d\n”、&Ptr);
};
void main(){
国际*nPtr;
printf(“&nPtr=%d\n”,&nPtr);
myFunc(nPtr);
printf(“&nPtr=%d\n”,&nPtr);
}
让我更清楚一点。这是我试图修复的代码。我所要做的就是让两个指针指向同一个地址。我想使用最佳编码实践

#include<stdlib.h>
#include<stdio.h>

void myFunc(int *Ptr){
    Ptr = malloc(10*sizeof(int));
    printf("*Ptr = %d\n", *Ptr);
};

void main(){
    
    int *nPtr;
    printf("*nPtr = %d\n", *nPtr);
    
    myFunc(nPtr);
    printf("*nPtr = %d\n", *nPtr);

}
#包括
#包括
无效myFunc(int*Ptr){
Ptr=malloc(10*sizeof(int));
printf(“*Ptr=%d\n”,*Ptr);
};
void main(){
国际*nPtr;
printf(“*nPtr=%d\n”,*nPtr);
myFunc(nPtr);
printf(“*nPtr=%d\n”,*nPtr);
}
main()
中,您将在
main()
的堆栈框架中获得
nPtr
的地址;在
myFunc()
中,您得到的是
nPtr
副本的地址,该副本通过值传递给
myFunc()
作为
Ptr
(因此您实际上得到的是
Ptr
,它是不同的),并且存在于
myFunc()
的堆栈框架中。

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

对于此函数

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

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

因此,当您返回main并检索原始指针地址时,它将显示此函数的原始地址

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

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


因此,当您返回main并检索原始指针地址时,它将显示回原始地址

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

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

#include<stdio.h>

void myFunc(int *Ptr){
    printf("Ptr = %p\n", (void *)Ptr);
};

int main(){
    int x;
    int *nPtr = &x;
    printf("nPtr = %p\n", (void *)nPtr);
    myFunc(nPtr);
    printf("nPtr = %p\n", (void *)nPtr);
}

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

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

#include<stdio.h>

void myFunc(int *Ptr){
    printf("Ptr = %p\n", (void *)Ptr);
};

int main(){
    int x;
    int *nPtr = &x;
    printf("nPtr = %p\n", (void *)nPtr);
    myFunc(nPtr);
    printf("nPtr = %p\n", (void *)nPtr);
}

myFunc使用*Ptr,而main使用int*nPtr。在main中尝试int*Ptr。nptr是指向下一个节点的指针如何使nptr=Ptr?是否要使nptr==Ptr或使nptr==nptr?这是两件完全不同的事情。后者是不可能的,因为这是两个不同的变量,每个变量必须有自己的地址。前者已经存在,但您正在函数中打印
&Ptr
,而不是
Ptr
。如果您打印了
Ptr
,它将与
nPtr
相同,但与您在
main()
中打印的
&nPtr
不同。您应该使用
%p
格式说明符来打印F指针。并非所有指针都是
int
s,有些更长。myFunc使用*Ptr,而main使用int*nPtr。在main中尝试int*Ptr。nptr是指向下一个节点的指针如何使nptr=Ptr?是否要使nptr==Ptr或使nptr==nptr?这是两件完全不同的事情。后者是不可能的,因为这是两个不同的变量,每个变量必须有自己的地址。前者已经存在,但您正在函数中打印
&Ptr
,而不是
Ptr
。如果您打印了
Ptr
,它将与
nPtr
相同,但与您在
main()
中打印的
&nPtr
不同。您应该使用
%p
格式说明符来打印F指针。不是所有的指针都是
int
s,有些更长。如何使nPtr=Ptr?如何使nPtr=Ptr?