学习c语言,必定绕不过指针。对指针运用的水平高低直接决定了一个人c语言的水准。然而对于新手、工作经验不长的程序员,对指针的理解可能未必深刻,会用不等于真的明白了。下面给大家提供一些笔者对指针理解的心得,希望能对大家有所帮助。
几乎所有的书上都会写:指针就是地址。但是必须要明确的一点则是:一个指针变量并不等于一个指针。比如:
char *p;
这仅仅是说明这个p是用来标识一个指针的,即我们通过p可能访问到某个地址,但是仅仅代表可能,并不能说明p已经能访问哪个地址了。
所以几乎所有的c语言书籍才会说,未初始化或者未赋值的指针变量是不允许使用的。例如直接printf("%s\n", p);就是非法的。
这个例子很简单,大家一看就明白,如果是双层指针char **p;呢?这个该如何理解? 比如我们要让p[0]、p[1]分别指向不同的字符串,应该如何写?p[0]=strdup(str)?
如果这么写就错了,前面已经说过,一个指针变量并不等于一个指针,那么对于p来说,它并没有指向实际的地址,可能正指向美利坚呢。所以直接p[0]=strdup(str)的行为是未定义的,虽然strdup会分配空间,但是它分配的空间是给字符串用的,p实际上还是没有指向实际的空间,结果是程序会崩溃。所以使用二重指针,首先得先给它分配空间。即:p = malloc(char **);然后才能用p指向的地址来进一步指向相应的字符串。同理,如果指针有3层或者以上,按照上面的理解,使用时应该每一层指针都要分配空间。
类似的,结构体指针也是一样的。所以理解的关键还是在于:每一层指针,都必须有实际指向的地址。
不管它是多重指针的还是结构体指针,把握好这个核心原则,指针就不难理解了。
阅读(5484) | 评论(0) | 转发(2) |