关于指针的思考

来源:互联网 发布:linux jdk 7u80 编辑:程序博客网 时间:2024/05/15 04:27

前两天在网上看了一道关于指针的题,对于我这种,看到指针就蒙圈的人来说,挺有意思,下面就这道题,咱好好看看。

#include <stdio.h>
voidf(char**p){
      *p +=2;
}
main()
{
    char*a[] = {"123","abc","456"},**p;
    p = a;
    f(p);
    printf("%s\r\n",*p);
}
最后打印出来的应该是啥呢

我一开始写的是456,但其实是3

在VS上运行了下,确实是3,这是为啥呢?

char *a[] 表示的是一组指针数组,每个元素是char类型指针。也就是说,数组里面指向的是一系列指针的地址,而不是字符的地址;

char **p 表示指向指针的指针,其实跟*a[]是一样的,你可以认为 **p=*a[];

首先,a[0]指向的是第一个字符串的第一个字符, 

           a[1]指向的是第二个字符串的第一个字符, 

           a[2]指向的是第三个字符串的第一个字符, 

既然*a[]=**p,那么a[]=*p,

再往下,a=p,而a指向的为第一个字符串的第一个字符, 所以,p指向的为第一个字符串的第一个字符, 

再看,a+2=a[1],也就是说,*(p+2)=a[2] 也就是456

那为啥*p+=2 最后出来的是3呢?

   看下面 

   a[0]                    a[1]                     a[2]

      m  g                  n                          k

      1   2   3   \0       a    b    c   \0       4     5     6  \0

a[0],a[1],a[2] 里面分别存的是指向 1、a、4的指针m、n、k,

a[0]++肯定是a[1],这没毛病, p=a,那p++,*p=a[1]也没毛病;

但是!!!!

*p指向的是m,所以,如果是*p=*p+1,那就是m++,即g的位置;

如果是p++,那就是n的位置,

注意啊,这里 *p++与*p=*p+1不同,*p++=*(p++)=*(p+1)!=*p+1这点要切记!

最后 记住这个  i=*p++意思就是先取值后+1! 经常容易混了。





1 0