关于结构指针

  1. struct Node *ps定义一个Node类型的结构指针。
    注意,此时并没有指向Node的某个结构

  2. 必须malloc分配结构空间,并返回结构地址,给ps

  3. 这样ps才能有类似的ps->next操作

想要在函数中改变某个指针的指向的时候

通常是,函数中malloc返回给指针的情况

  1. 显然,如果我们想通过函数改变某个变量的值,那么我们可以传递这个值的指针给函数。让这个指针指向另外一个值

  2. 同样地,如果我们想要改变某个指针,那么就要传递指针的指针给函数

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct Node *List;
void InitList(List *L)
{
*L = (PtrToNode)malloc(sizeof(Node));
if(*L == NULL)
{
fprintf(stderr, "out of space.");
exit(1);
}

(*L)->next = NULL;
}

想要不改变指针在main()中的指向

直接传递指针就好啦,不传递指针的指针就不改变原来的指向哦

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
void fun(char *str)
{
(str)++;
printf("%s\n", str); //2
}
int main()
{
char *s[] = {"Ferry", "Chan", "faye", "chan"};
char * x = s[2];
printf("%s\n", x); //1
fun(x);
printf("%s\n", x); //3
}
输出
1
2
3
faye
aye
faye

以上两点总结

传给函数指针只能改变它的值,不能改变它的指向。
重点,这是因为定义函数的参数是局部变量,调用函数时()里的值,只是赋值操作。注意,只是赋值
本质都是传值,只不过值,可以是指针。而且传给函数的,都可以理解为是原值的一个副本。既然是副本,那就可以理解了,改变副本是无法改变原值的。

看看,这里定义了两个指针。p和str。其中p 指向 (malloc)分配的内存,str 还指向 NULL。

1
2
3
4
5
6
7
8
9
10
11
void GetMemory( char*p )
{
p = (char*) malloc( 100 );
}
void Test( void )
{
char*str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}