使用指標無法修改主函式的值
阿新 • • 發佈:2018-11-16
#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(按值呼叫)