使用指针无法修改主函数的值

#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0

typedef struct Lnode
{
    int data;
    struct Lnode * next;
} Lnode, * LinkedList;

int InitList_L(LinkedList L)
{
    int func_state = ERROR;
    L = (LinkedList)malloc(sizeof(Lnode));
    printf("L in init pointer is %p \n", *L);
    if (L)
    {
        L->data = 955;     // TODO
        L->next = NULL;
        func_state = OK;
    }
    printf("init data %d \n", L->data);

    return func_state;
}

int main(void)
{
    Lnode node;
    LinkedList L = &node;
    printf("L in main brefore init pointer is %p \n", *L);
    InitList_L(L);
    printf("L in main after init pointer is %p \n", *L);

    printf("main data %d \n", L->data);

}

程序的运行结果如下图:
在这里插入图片描述
可以看到在main函数中的在调用InitList_L后被更改,这当中的原因何在?
L是一个指向struct Lnode 的指针(LinkedList是使用typedef定义的指向结构体的指针的别名, 相当于 Lnode * )
问题出在哪里呢?
我们知道使用指针可以在子函数中修改主函数中的值,
操作的是指针所指向的对象的值
而上面的操作的是指针本身,指针本身不能交换。我们再看看下面的这个例子:

#include <stdio.h>
int swap(int * a, int * b)
{
    int temp;

    temp = *a;
    *a = *b;
    *b = temp;
    printf("int swap address a: %d b: %d\n", &a, &b);
    printf("in swap a: %d b: %d \n", *a, *b);
}
int main(void)
{
        int a = 3;
        int b = 4;
        printf("in main before swap a: %d b: %d \n", a, b);
        printf("int main after swap address a: %d b: %d \n", &a, &b);
        swap(&a, &b);
        printf("int main after swap address a: %d b: %d \n", &a, &b);
        printf("in main after swap a: %d b: %d \n", a, b);
}

输出结果如下图:
在这里插入图片描述

可以看到这里swap交换了a,b的值,但是没有交换a,b的地址,这当然了
这说明指针指向的值是call by reference(按引用调用)引用值的就是指向,而就指针自身而言,指针也是call by value(按值调用)

猜你喜欢

转载自blog.csdn.net/weixin_42912350/article/details/83592757
今日推荐