指针进阶(一)

指针一段时间没有接触就有点糊涂了,特别是今天学到链表的时候,一涉及到结构体指针大脑就转不过弯来。经过漫长的思考终于有了点收获,小结一下如下。
程序中定义一个指针:
int *p;//这句话一执行,cpu就会分配一个存储空间给这个指针变量,指针变量他也是个变量,要用平等的目光看待指针变量,他就和定义普通变量int a;一样,有自己的存储空间(地址)
大家观念上会觉得他与众不同估计是因为我们印象最深的关于指针的东东就下面这两点:
1.定义完指针变量p后,单单p这个字符的意思就是p要指向的那种类型变量的地址
2.再者就是*p的意思是p指向的那个变量的值
只对这些印象深刻,记得的都是指针变量p对别人存在的意义,却忘了p他本身存在的意义和原因。
接下来就是今天的重点了:
指针变量p是变量,不可否认这一点,那么,这种稍微特殊一点变量p就有他自己的存储空间的地址:&p  。

我们常记得的上面关于指针的两点东东,都是指针变量存在了之后才有资格谈的,指针变量要存在cpu就要分配空间给他,有空间就有对应的地址。看一段测试代码就明白了。

#include <stdio.h>
int *p,a=100;
void main(void)
{
    p=&a;
    printf("*p=%d,p=%d,&a=%d,&p=%d\n",*p,p,&a,&p);
}
执行结果:



今天的另外一个收获:
向函数传递指针时,一定要确保这个传入的指针变量的指向是明确的!
比如说,不能这样做:即使变编译通过,运行时程序也会是奔溃的!

struct TagNode
{
    int data;
    struct TagNode *next;
};
typedef struct TagNode *LinkList;
LinkList L;
int InitList(LinkList L)
{
    ........
}
解释为什么:一执行完LinkList L;产生一个指向这种结构体的指针变量L,这时应该认识到,这个变量有自己的空间地址,同时,指针L它是指向一个未知的空间的,这个未知空间里面的数据极大可能是不能进行操作的。就跟定义一个普通变量一样,cpu只分配存储空间,他才不管这个空间是用来干什么的,具体要拿来干什么就是往后程序要完成的事情。
上面明显指针变量L指向不明,这样直接传入函数里面使用就是很大的错误。
因此,定义了结构体指针变量L后,在使用他之前的首要任务就是定义这个结构体指针的指向!
定义指针变量的指向:
我们无法知道这个结构体指针变量的指针指向哪里,但是可以十足把握的获得他的存储空间地址,这就够了。
只要把这个结构体指针变量的空间内容设定为可用的内存池里面的地址即可。上面代码可以这样修改:

struct TagNode
{
    int data;
    struct TagNode *next;
};
typedef struct TagNode *LinkList;
LinkList L;//这里的L是指向结构体的指针,但L指向不明
int InitList(LinkList *L) //这里的形参指针变量L是指向一个指向结构体指针的指针
{
    ........
}
调用时:

InitList(&L);

就是把指向不明的结构体指针变量的空间地址传入函数里面。

OK了,记录完毕!












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值