1. 程式人生 > >使用指標無法修改主函式的值

使用指標無法修改主函式的值

#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(按值呼叫)