我试图通过c中的函数检索指针。如果指针是函数的返回值,则它可以工作。但是如果我将指针的地址传递给函数,我就不能从函数中更新解除引用的指针值(应该是存储在指针中的地址)。
请参阅代码和输出。为什么我不能同时使用GetPointer1()
和GetPointer2()
获得相同的结果?我错过了什么?
#include <stdio.h>
#include <stdint.h>
uint8_t SrcArray[2][3] = {{11,12,13},{21,22,23}};
uint8_t *p1;
uint8_t *p2;
void GetPointer1(uint8_t *p);
uint8_t* GetPointer2(void);
int main()
{
printf ("&SrcArray[0][0]: %d\n", &SrcArray[0][0]);
GetPointer1(p1);
p2 = GetPointer2();
printf ("p1: %d\n",p1);
printf ("p2: %d\n",p2);
return 0;
}
void GetPointer1(uint8_t *p)
{
p = &SrcArray[0][0];
}
uint8_t* GetPointer2(void)
{
return &SrcArray[0][0];
}
输出:
&SrcArray[0][0]: 6295604
p1: 0
p2: 6295604
答案 0 :(得分:7)
这是因为GetPointer1(uint8_t * p)的函数签名中的指针是按值传递的。如果要修改指针本身,则必须将指针传递给指针:
void GetPointer1(uint8_t **p) {
*p = &SrcArray[0][0];
}
否则,您可以修改指针指向的片段内存,但不能修改指针本身。
答案 1 :(得分:2)
它是函数local run = require("RunAPI_1208")
的本地变量,因为它是一个局部变量,它作为一个值而不是一个地址传递。
以下是代码的输出详细信息,以便更好地理解
GetPointer1
如果您想传递地址,则需要在变量说inside main: &SrcArray[0][0]: 6295616
value of pointer p1: 0
address of pointer p1: 6295640
inside GetPointer1: 0
value of pointer p: 0 //which ur taking to a pointer p and modifying p whihc is local to that function.
address of pointer p: 64030024
inside GetPointer1 after assignment:value of pointer p: 6295616
address of pointer p: 64030024
之前使用&
。
另外,如IGarFieldI的答案之一所述,您可以使用指向指针的指针。
&p1
因为void GetPointer1(uint8_t **p) {
*p = &SrcArray[0][0];
}
是全局变量,所以还可以访问所有可以直接使用P1
的函数,这是允许的,并执行相同的任务。
P1=SrcArray;
相当于ScrArray
,它们都给出了数组的地址。
答案 2 :(得分:1)
你有一个指向某个东西的变量p1。然后将它传递给函数GetPointer1。那里发生的是变量p1的值(这是它指向的值的地址!!!)被复制(!)到函数堆栈。这意味着您可以修改指向值(*p1
),但不能修改原始指针(p1
)本身,因为您只有它的副本。如果你想能够修改原始指针,那么你必须检索指针的地址并将其传递给函数,i。即你需要一个指针指针。你通过运营商地址&amp;来得到这个。所以你需要这个:
getPointer1(uint8_t** p) { *p = /*...*/; }
并通过
调用getPointer1(&p1);
答案 3 :(得分:1)
#include <stdio.h>
#include <stdint.h>
int SrcArray[2][3] = {{11,12,13},{21,22,23}};
int *p1;
int *p2;
void GetPointer1(int **p);
int* GetPointer2(void);
int main()
{
printf ("&SrcArray[0][0]: %d\n", SrcArray[0][0]);
GetPointer1(&p1); /*<-- passing the reference of pointer p1 */
p2 = GetPointer2();
printf ("p1: %d\n",*p1);
printf ("p2: %d\n",*p2);
return 0;
}
void GetPointer1(int **p) /*<-- using double pointer */
{
*p = &SrcArray[0][0];
}
int* GetPointer2(void)
{
return &SrcArray[0][0];
}
o/p
rabi@rabi-VirtualBox:~/rabi/c$ gcc -g stack3.c
rabi@rabi-VirtualBox:~/rabi/c$ ./a.out
&SrcArray[0][0]: 11
p1: 11
p2: 11
rabi@rabi-VirtualBox:~/rabi/c$
答案 4 :(得分:0)
&#34;但是,如果我将指针的地址传递给函数。&#34;但是你没有传递指针的地址,你传递指针的副本;更改副本(如您所见),不会更改原件。如果您实际上按照预期传递了&amp; p(p的地址),您将能够修改它 - 我不确定语法。编辑:void GetPointer1(uint8_t ** p)也许?