为什么指针的值仍为20?

时间:2019-03-26 10:11:24

标签: c pointers call-by-value

# read image as RGB and add alpha (transparency)
im = Image.open("frontal_1.jpg").convert("RGBA")

# convert to numpy (for convenience)
imArray = numpy.asarray(im)

# create mask
polygon = [(444, 203), (623, 243), (691, 177), (581, 26), (482, 42)]

maskIm = Image.new('L', (imArray.shape[1], imArray.shape[0]), 0)
ImageDraw.Draw(maskIm).polygon(polygon, outline=1, fill=1)
mask = numpy.array(maskIm)
...
newIm = Image.fromarray(newImArray, "RGBA")
newIm.save("out.png")

为什么在函数退出时指针仍然是20? 我在void func(char *p) { int q = 13; p = &q; printf("%d\n", *p); } void main(void) { int var = 20; int *p = &var; printf("%d\n", *p); func(p); printf("%d\n", *p); } 结束时跳了一下,在其中修改了指针,在最后一个func()中,printf()的值将指向堆栈中的一些随机内容。

2 个答案:

答案 0 :(得分:6)

这是你的

void func(char *p)
{
    int q = 13;
    p = &q;
}

这意味着“使p指向q”并更改p的值,该值只是函数内部的一个变量。函数外部没有任何变量值更改。

如果你要写这个

void func(char *p)
{
    int q = 13;
    *p = q;
}

这意味着“将p指向的变量更改为13”,这将在外部看到,这意味着main中的变量var会更改其值(取决于字节序)它将是什么,因为它是int而不是指针声称的char)。

如果要在main中更改指针的值,则需要一个双指针:

void func(char **p)
{
    int q = 13;
    *p = &q;
    printf("%d\n", *p);
}

这意味着“使指向p的指针指向局部变量q”,在这种情况下,您将像在main中所期望的那样悬挂一个指针。

答案 1 :(得分:3)

否,p本身就是值。在p内部对func()所做的任何更改都不会反映回main()

出于完整性考虑,对p所指向的值(即*p)所做的任何更改都会反映在main()中。