数组指针,指针
同样是将数组首地址存入指针变量里面,为什么在取得时候*(*p2+i)要多加一个*,而*(P+1)的P不用加*,我知道*p2取得是P2这个地址对应的值是temp的首元素的地址,但是这样反过来想*(P+1)就想不通了
*P2取得是P2这个地址对应的值是temp数组元素的首地址,(*p2+i)是temp数组元素的首地址加偏移量i,最后*(*p2+1)就是取这个首地址加偏移量的地址的值了,但是为什么*(p+1),这个P不用*可以直接+1取到下一个元素,是因为这个P是直接表示的是b数组元素的首地址? 本帖最后由 行客 于 2019-2-15 21:35 编辑
int *p=b;,这里的p指向的是一个int类型的变量,也就是printf("*p=%d",*p);这里的*p输出的是b数组的第一个元素,即b;所以p代表的是b的地址。那么*(p+1)代表的是int类型的下一个地址,即b。
int (*p2)=&temp;,这里的p2指向的是一个int 类型的数组,p2是一个数组指针。*p2才代表了第一个数组元素,即相当于上面的p。
不知道,说到这里你想明白了没有。如果不清楚请继续跟帖。 第二个程序的*p2等价于第一个程序的p 行客 发表于 2019-2-15 21:31
int *p=b;,这里的p指向的是一个int类型的变量,也就是printf("*p=%d",*p);这里的*p输出的是b数组的第一个 ...
P2是指向int类型的数组和p指向int类型的变量,不都是指向地址吗,不都是要在加*才可以取这个地址里面的值吗,我还是没搞懂 行客 发表于 2019-2-15 21:31
int *p=b;,这里的p指向的是一个int类型的变量,也就是printf("*p=%d",*p);这里的*p输出的是b数组的第一个 ...
那b和&temp是不是都是把数组首元素的地址存放到了指针P和指针P2里面了,所以不是应该*p和*p2才是取这两个指针指向数组首元素的地址? 本帖最后由 行客 于 2019-2-17 10:02 编辑
FE0636556 发表于 2019-2-16 20:14
那b和&temp是不是都是把数组首元素的地址存放到了指针P和指针P2里面了,所以不是应该*p和*p2才是取这两个 ...
以下为垒了半个小时的文字,希望你能认真看,并希望能帮助到你:
问题一:
P2是指向int类型的数组和p指向int类型的变量,不都是指向地址吗,不都是要在加*才可以取这个地址里面的值吗,我还是没搞懂
回复:
指针都是有类型的,虽然指向的地址都是同一个,但由于指针的原本类型不一样,所以你解引用时*p结果也不一样。比如
int *p;这里的p将会指向一个4字节,而char *p;里的p会指向一个1字节。即便两个指针指向的是同一个地址,解引用时的*p结果也不一样。同样,*(p+1)在int *类型下向后移动4个字节,而在char *类型下向后移动1个字节;也就是+1情况下的向后移动的“步长”是不一样的。
请你首先一定要看明白了问题一的答复,再看下面的问题二。
问题二:
那b和&temp是不是都是把数组首元素的地址存放到了指针P和指针P2里面了,所以不是应该*p和*p2才是取这两个指针指向数组首元素的地址?
回复:
**** Hidden Message *****
如有疑问,请继续跟帖。 回复,看完整的答案! 行客 发表于 2019-2-15 21:31
int *p=b;,这里的p指向的是一个int类型的变量,也就是printf("*p=%d",*p);这里的*p输出的是b数组的第一个 ...
你的意思是 p2 指向的是 temp 数组的第一个元素的 地址的地址 吗?所以*p2才是数组的第一个元素的的地址,而**p才是第一个元素的值? 2316829671 发表于 2019-2-21 09:57
你的意思是 p2 指向的是 temp 数组的第一个元素的 地址的地址 吗?所以*p2才是数组的第一个元素的的地址 ...
不是的。P2是指向int类型的数组。你看下本帖我7楼的回复。 行客 发表于 2019-2-21 15:37
不是的。P2是指向int类型的数组。你看下本帖我7楼的回复。
那百度百科https://baike.baidu.com/item/%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84/8669080?fr=aladdin为什么这么解释
2316829671 发表于 2019-2-22 20:21
那百度百科为什么这么解释
和这个解释没有矛盾的地方啊。所谓数组指针的不可移动,并非是指针的真正不可移动,而是指的是再自增1向后就可能不是标准的同类型数组了,也印证了P2是指向int类型的数组,也就是说,如果p2+1是向后移动20个字节,20个字节后到底是什么就不好确定了。 p2是个指针数组,也就是它存放的是地址,也就是说p2中的元素都是地址值,(*p2)=&tem
实际上是将temp的元素首地址传给p2的第一个元素,*p2得到的是temp的首地址,(*p2+i)就是temp中第i+1个元素的地址,*(*p2+i)就是取内容了啊,就是元素值了啊 行客 发表于 2019-2-17 09:30
以下为垒了半个小时的文字,希望你能认真看,并希望能帮助到你:
问题一:
谢谢行客的详细解答,我想我大概明白你的意思了,但是还有一个疑问:int (*p2) = &temp,那么p2的类型是 int (*),也就是p2=数组temp的地址,也就是temp的地址,那么解引用 *p2 就是获得数组temp的地址对应的值,那么这个值不就是temp的首个元素吗?但是,实际上解引用 *p2仍然是数组temp的地址,也就是说,在数值上,p2=*p2。你能告诉我,为什么是这样吗? mqcake 发表于 2019-2-19 15:17
回复,看完整的答案!
答案 本帖最后由 bin554385863 于 2019-9-15 12:51 编辑
指针的确头大 回复,看大佬解析! 第一张图:把数组b的首地址放在指针p中存放,p+1指针移动到数组中第二个元素的地址,p+2指针移动到第三个元素的地址,然后用取元素符号*就可以把对应位置的元素取出来了
第二张图:括号的优先级最高,所以这是一个指针类型的数组,而且数组中的元素存放的是{1,2,3,4,5}这些值的地址,*p2+i表示第i位元素的地址,再用*将总共地址中存放的元素取出来 数组指针,指针 [修改] 数组指针(*p)中(*p)可以看成是二维数组首地址p
页:
[1]
2