请教C语言指针问题

inta[]={.....};int**b;**b=a;//这个语句的含义是什么?如果执行++b操作,b,*b,**b及数组a相应的值如何变化?谢谢... int a[]={.....};
int **b;
**b=a;//这个语句的含义是什么?如果执行++b操作,b,*b,**b及数组a相应的值如何变化?谢谢
展开
 我来答
beddy1
2011-08-09 · TA获得超过1988个赞
知道大有可为答主
回答量:2271
采纳率:0%
帮助的人:2124万
展开全部
首先是数组的概念,很多人对C语言的数组的概念理解并不到位,有时间可以找打相关的资料看一看,像a这样的一维整形数组可以隐式转换为 int*, 所以你后面的 **b = a; 这句代码是错误的。
很多人对指针的理解也是不太正确的,其实指针的意思并不复杂,指针保存的是地址对象,同时它还需要携带一个信息就是该地址对象存储的内容的型别。所以 int **b; 中的 b一个地址对象,而该地址存储的内容是int*, 即一个整形的地址信息。所以后面的代码只能这样写 *b = a; 意思是什么通过前面的描述你应该清楚了。 然后++b的意思就比较难于解释了……
我们假设如下吧:
int a[] = {1, 2, 3, 4 ,5};假设数据a的首地址为0x000000FF;那么该数组的长度就是5*4Bytes=20Bytes了。(这里假设int型占用4个字节)
而int **b; 假设b的地址为 0x 0000FF00,而该地址的存储的数据的持续长度为4Bytes;(32位环境)
*b = a; 会把 0x000000FF这个地址值赋值给以地址0x0000FF00开始的4Bytes的空间里,这里我们假设机器为32位的,所以内存地址为32位。
++b 就是把存储在地址0x0000FF00这个地址的指针内容加1个单位,因为b为指针型别,所以这1个单位是4Bytes,所以在该地址存储的内容变为 0x000000FF+0x4 = 0x00000103;
我相信这样解释应该很清楚了?
更多追问追答
追问
如果a是*a[],指针数组那?请问
追答
int *a[] ... 么?
这样的话你仔细看我前面的描述应该也能清楚,a这个数组存储的内容为地址,而该地址存储的内容应为整型型别。
如有三个整数i1, i2, i3 的地址分别为 0xF0, 0xF4, 0xF8,
数据a 本身有个地址,而在该地址内存储的内容就是0xF0,0xF4,0xF8这三个地址信息。
clitoriscn
2011-08-09 · TA获得超过3628个赞
知道小有建树答主
回答量:3258
采纳率:0%
帮助的人:1475万
展开全部
**b是个二级指针,
a是一维数组,
这样不能赋值,要进行指针转换的
更多追问追答
追问
其实是,**b是一个函数的形参,a[]是实参。

如果执行++b操作,b,*b,**b及数组a相应的值如何变化?
追答
那也不行,你看下你的数组应该是个2维数组.
++b是将b指的地址增加1 ,也就相当于b往后移动了一位,指向了后面一个元素.如果不对*b进行操作的话,那么a的值是不会变化的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ranai623
2011-08-09 · 超过12用户采纳过TA的回答
知道答主
回答量:376
采纳率:0%
帮助的人:205万
展开全部
楼主是不是想知道s和a的值为什么会一样,而不是随机的值吧。s和a都是在还有,一般打印指针值用的格式控制串是%p。 在c语言里,((char *)*
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风韵红唇
2011-08-09
知道答主
回答量:11
采纳率:0%
帮助的人:1.8万
展开全部
int (**b)[]=a
追问
如果执行++b操作,b,*b,**b及数组a相应的值如何变化?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式