现如今,编程语言五花八门,程序员们开始追求最易懂的语言以及最方便的工具来开发程序,不过笔者认为,真正入门的应该还是C语言,只有真正将C语言学精通了,那以后学任何东西都会很容易上手,而对于C语言而言,最最重要是其实就是数组和指针,而数组和指针又是密切相关的。
下面我奉上一段小程序用来测试对指针的了解程度;如果能够全部答对,那么对指针和数组应该了解的还可以了(注:b存放的地址值为1245052):
int main()
{
int a;
int *b;
int **c;
b=&a;
int *d[2]={b,b};
*b=26;
c=&b;
printf("%d/n",a);
printf("%d/n",*b);
printf("%d/n",b);
printf("%d/n",&b);
printf("%d/n",c);
printf("%d/n",&c);
printf("%d/n",*c);
printf("%d/n",c[0]);
printf("%d/n",c[0][0]);
printf("%d/n",**c);
printf("%d/n",d);
printf("%d/n",d[0]);
printf("%d/n",d[0][0]);
printf("%d/n",d[1]);
printf("%d/n",d[1][0]);
printf("%d/n",*d[0]);
printf("%d/n",*d[1]);
printf("%d/n",*d);
printf("%d/n",&d[1]);
return 0;
}
********************************************************************
答案:
********************************************************************
分析:
首先我们看到程序第四行b=&a;就是说把a的地址值取出来给b(注意:其实指针就是一个地址值,*代表地址值),这样b(注意此时b的类型就是int *,代表b是个int类型的地址值)就是a的地址值,接下来看到程序第六行*b=26(注意此时*b的类型就是int);我们知道b是个地址值,那么*b就是b所指向的值了,也就是说把26赋给b所指向的值,同时b,&a是相同的,所以a=26;*b=26;b=1245052;
接下来&b,就是说取b的地址值,也就是说取地址值的地址值;那么由于内存是连续分配的,并且地址值是按字节来分配的,一个整型值占4个字节,所以&b=1245048
看程序第七行,c=&b;将b的地址值给了c(根据定义,c是个指向地址值的地址值(指针的指针));那么c=1245048;而&c=1245044,因为取的是c的地址值,*c(注意*c的类型,是int*类型),指向*c的是c,c就是b的地址值,那么*c显然就是b的值罗。那么**c就是b指向的值罗。
这样*c=1245052;**c=26;
至于d,d是个指针数组,我们知道d代表这个指针数组的首地址,等同于&d[0],可能我们会想到d就是b原来的地址值,可是却不是,实际上d=1245036,即&d[0]=1245036,&d[1]=1235040.这是为什么呢?因为我没有把b的地址值赋给d,我定义d的时候是重新设定了一个地址值,也就是说有两个不同的地址值指向b,好,接下来d[0]很显然就是指的b,所以d[0]=1245052,那么d[0][0]就是d[0]指向的值,所以d[0][0]=26,同理可知道d[1]和d[1][0];而且d[0][0]和*d[0]是一样的意思,都是取d[0]指向的值。最后*d,*d等同于*(&d[0]),也就是b的值,所以*d=1245052.
呵呵,好了,终于解释清楚了,其实在理解指针只要搞清楚地址值和值,地址值指向值,而值有可能还是个地址值,地址值就是一个指针,不要把空间这个概念放进去,如果夹杂了指针空间什么的名词进去,就会越搞越乱,其实对于空间来讲,值放的地方就是一个空间而已。