int a[10]={1,2,3,4,5,6,7,8,9,0},*p; p=a; printf("%x尀n",p); printf("%x尀n",p+9); }

2025-03-13 03:24:39
推荐回答(5个)
回答1:

p是int *型指针。
所以 p+n(n为整数)
p实际的地址值为((int)p)+sizeof(int)*n
这里 输出的也就是
0x194+sizeof(int)*9
注意,这里的194是16进制的。因为是0x输出。
如果是sizeof(int) =4 也就是32/64位系统,那么输出为
0x194+4*9=0x194+0x24=0x1B8
输出1b8
如果是sizeof(int) =2 也就是16位系统,那么输出为
0x194+2*9=0x194+0x12=0x1A6
输出1a6

回答2:

首先,指针p指向了数组的首个元素,也就是a[0],对于p+9,不难得知,指针向后移动了9个元素,答案也即是a[9],就是0 ,指针移动时的移动单位是按存储元素来定的,比如说int,指针偏移量为9的话,实际上是移动了9*4个字节,但是输出的时候你没必要考虑是否移动了多少个字节,你就按偏移量和指针指向的起始位置数一下就行了。希望你能采纳!

回答3:

194 是十六进制的,转换十进制也就是:404
404 +4*9 = 404+36 = 440;
转换成十六进制,也就是1B8

最后结果 1B8

因为每个整数占四个字节,而地址上的+1,其实是指加上一个地址间隔。
像整数数组就是4个。

回答4:

1、定义数组后在内存中开辟连续的存储空间,根据定义的数据类型,每个数组元素占用不同的字节。int类型占用4个字节,如果a[0]所在的地址为0x12,则a[1]所在的地址为0x16.
2、指针指向数组,数组元素为Int类型,占4个字节,指针p每次加1,相当于指向下一个数组元 素。如p =a,则printf("%x\n",p)输出p的内容(指针的内容是地址)为0x12;则printf("%x\n",p+1)为0x16

注意:p输出的是p指向的单元的地址。*p输出的p指向单元中的元素。

回答5:

你的程序的确很绕啊。但是在我想了一下换是明白了。:
你只要把你每次改变b记下来就明白了
我给你说10吧
28也是一样的
首先b
=
2;
之后fun函数传过去了a[2]的地址就是3
,经过运算函数返回了b的值是5
,在接着就是
b=fun(&a[i])+b;这句
最后b就被改写成了10了
最后输出就是10
第二次循环b的值是10
不是2
这个关键的
那28也就是这个道理了。明白了吧!!
这里我就是说一下为什么第一次循环是10
因为你的程序只是运行了一次,所以b的初始化只经过一次。要想在变成2,就要重新运行程序,这时候b在进行初始化,变成2.好了就这样了!!!希望对你有用!
希望对你能有所帮助。