为什么我不能将指针作为参数传递?

时间:2016-03-16 08:01:54

标签: c function pointers multidimensional-array

我试图通过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

5 个答案:

答案 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)也许?