学习中对C指针的质疑

学习中对C指针的质疑,c,pointers,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); te

在大学学习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);
}
为什么如果I
printf(“%I”,*int\u指针)
进入test2函数,它会输出6,而主函数中的
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


提前感谢。

test1
修改
int\u指针所指向的变量(
main
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
+
free
而不是局部变量。

在第一种情况下:

  • 初始化变量
    n
    ,并将
    p
    指针指向 它

  • 然后将
    p
    n
    的地址)的值提供给
    test1()
    并更改
    
    int\u指针
    (并且
    int\u指针
    p
    具有相同的值,因此 更改
    n
    的值

  • 当您调用
    test2()
    并给您相同的地址时,但在 函数更改本地
    int\u指针的值,使其
    指向本地
    i
    ,但
    p
    保持不变

这就是为什么在
test2()
由
int\u指针指向(
),并在
main()中打印(
5 由
p
指向的值

第二种情况:

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

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

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

  • 之后,更改
    var1
    的值,但
    var2
    保持不变, 这就是为什么你得了5分

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

为了更好地理解指针,它帮助用铅笔画出一些图片,这些图片中的小框表示内存,箭头在它们之间指向。在
test2
中,函数接收一个指针副本,其中分配了局部变量的地址因此从
test2
返回时,
test2
中的任何更改都不会在
main()中看到
。在下一种情况下,
var2
是在
var1
重置为
40
之前设置的,因此
var2
使用的唯一值来自
var1=10
时。指针只是一个普通变量,将其他对象的地址作为其值。换句话说,指针指向其他对象所在的地址可以在内存中找到。请记住您是否正在更改指针持有的地址(例如
int\u pointer=&i;
),或者您是否正在更改指针持有的地址的内存值(例如
*int\u pointer=5;
)注意,在第一种情况下,对指针的纯赋值,在第二种情况下,对取消引用的指针的赋值用于更新存储在指向内存地址的值。。