学习时对C指针的怀疑

时间:2019-07-20 10:26:33

标签: c pointers

在大学学习C语言时,我遇到了一些关于指针的不确定性,所以我写了我能想到的最简单的代码。

void test1(int *int_pointer) {
    *int_pointer = 5; 
}

void test2(int *int_pointer) {
    int i = 6;
    int_pointer = &i; 
}

int main(void) {
    int n = 8;
    int *p = &n;
    test1(p);
    test2(p);
}

为什么我printf("%i", * int_pointer)进入test2函数,却打印出6,而main中的printf("%i", * p)却打印出5(而不是6)?

第二个问题是关于以下代码的。

int main (void) {
int var1 = 10;
int * var1p = & var1;
int var2 = * var1p / 2;
int * var2p = &var2;
var1 = 40;
printf("%i", * var2p);
}

如果我更改var1的值并将var2p指向var2(等于* var1p / 2),为什么在这种情况下出现5个而不是20个?

谢谢。

2 个答案:

答案 0 :(得分:2)

在第一种情况下:

  • 您初始化变量n,并制作一个p指针以指向 它。

  • 然后将pn的地址)的值提供给test1() 并更改由指向的内存字段的值 int_pointer(和int_pointerp具有相同的值,因此它 更改n的值。

  • 当您致电test2()并给您相同的地址时, 函数,您可以更改本地int_pointer的值,因此它将 指向本地i,但p保持不变。

这就是为什么在test2()函数6中打印(    由int_pointer指向),并在main()中打印5(    p指向的值。

第二种情况:

  • 您将var1初始化为10,然后使var1p指向 它。

  • 然后将var2初始化为var1p所指的一半,因此 10/2 = 5。

  • 然后初始化var2p,因此它将指向var2

  • 此后,您更改了var1的值,但var2保持不变, 所以这就是为什么你得到5。

var1var2是两个不同的变量,因此它们有自己的变量    内存中的字段。如果要打印40张,则应    var2p指向var1,就像var2p = &var1

答案 1 :(得分:1)

test1修改int_pointermain的{​​{1}})指向的变量。

n修改指针本身。参数变量是它们所属函数的局部变量,更改它们对调用者没有影响。

例如,以下内容对呼叫者也无效:

test2

如果要在调用方中修改指针,则必须将指针传递给指针。

void test3(int i) {
    i = 9;
}

test(n);

请注意,返回(通常或通过参数)指向局部变量的指针没有任何意义,因为当函数返回时,它不再存在。这就是为什么我使用void test4(int **int_pointer_pointer) { int *int_pointer = malloc(sizeof(int)); *int_pointer = 10; *int_pointer_pointer = int_pointer; } int *int_pointer; test4(&int_pointer); printf("%d\n", *int_pointer); free(int_pointer); + malloc而不是局部变量的原因。