测试一下你对指针的了解

   现如今,编程语言五花八门,程序员们开始追求最易懂的语言以及最方便的工具来开发程序,不过笔者认为,真正入门的应该还是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.

呵呵,好了,终于解释清楚了,其实在理解指针只要搞清楚地址值和值,地址值指向值,而值有可能还是个地址值,地址值就是一个指针,不要把空间这个概念放进去,如果夹杂了指针空间什么的名词进去,就会越搞越乱,其实对于空间来讲,值放的地方就是一个空间而已。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值