我对指针的理解有点陌生,所以我希望有人能检查一下,以确保我对指针的工作方式有正确的想法。我试图简化指针是什么以及如何使用它们的概念

functA(int *numb){

functB(numb);

}

functB(int *numb){

functC(numb);

}

functC(int *numb){

*numb+=1;

}

int main (){

int testNumber = 0;

functA(&testNumber);
.
.
.
}

所以总的来说,我把testNumber的地址发送给funct A,所以当我把这个地址发送给functA时,没有问题,对吧?
因为funct A有一个指针参数,它可以保存一个地址,所以当我发送一个地址时它不会遇到问题,对吧?然后,由于numb(在functA中)是一个指针,我可以将它发送到functB,因为functB可以接受一个地址。另外,我仍然发送testNumber所在的地址,对吗?
再次,我将numb(从functB)发送到functC,在functC中,我取消了这个位置的围栏(有没有更好的方法说这个?)并将计数增加1。所以当这个完成时,testNumber应该是1,对吗?
我知道这听起来很傻,但我只是想从概念上理解这一点。我花了比我愿意承认的更多的时间试图把这个概念写在我刚刚提交的一个项目上(我做了,但花了太长时间)

最佳答案

变量存储在内存中的某个位置,并在其中存储一个值。每个地方都有地址。
variable
location_value
location_address
指针(比如,int *p)只是一个变量,就像其他变量(比如,int a;)一样。区别是指针存储某个位置的地址(您已经知道)。
variable: int testNumber = 10;
location_value: 10
location_address: 0xABCD000 // <-- 'testNumber' is stored at this location
----------------------------
variable: int *numb = &testNumber;
location_value: 0xABCD000 // <-- note: value of 'numb' is an address, address of 'testNumber'
location_address: 0x1234000 // <-- numb itself is stored at 0x12340000
因为,numb是一个变量,您可以继续将其值赋给同一类型的其他变量。
在您的情况下functC::numb = functB::numb = functA::numb = &testNumber = 0xABCD000。这是正确的。
因此,当您取消引用*functC::numb时,您正在访问存储在地址functC::numb的变量,而地址恰好是testNumber。所以当你这样做时,testNumber会增加

关于c - 在函数之间传递指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41930685/

10-13 08:02