#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(按值调用)