1.
引用网络回答的一篇文章相关段落如下:
int i = 5, j = 6, k = 7;
int *ip1 = &i, *ip2 = &j;
现在我们可以这么写:
int **ipp = &ip1;
那么现在指针 ipp 指向了 ip1,ip1 指向了 i。*ipp 就是 ip1,**ipp 就是 i,或者说是 5。我们可以用我们熟悉的盒子箭头图来描述,像这样:
有兴趣学习交流c/c++的小伙伴可以进我的主页看看哦~
如果我们接着这么写:
*ipp = ip2;
我们就改变了 ipp 指向的那个指针(也就是 ip1),现在它指向 ip2 所指的地方。也就是说(ip1)现在它指向了 j:
我的疑问是:为什么在第二幅图里,ipp 还是指向 ip1 而不是 ip2?
最佳答案:
让我们暂时忘掉那些关于指针的各种类比。指针实际上存放的是内存的地址。
& 符号的意思是取地址,也就是返回一个对象在内存中的地址。
* 符号的意思是取得一个指针所指向的对象。 也就是如果一个指针保存着一个内存地址,那么它就返回在那个地址的对象。
所以当你这么写时 *ipp = ip2,实际上是把 ipp 存的地址所对应的对象,也就是 ip1 取到,然后把 ip2 存的值赋值给 ip1,也就是 j 的地址。
简单点就是:
&:取址。
* :取值。
作者:C语言编程
链接:https://www.jianshu.com/p/b556a7f528d2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2.待梳理红字的思路。
3.引入一个代码加深理解
使用指向指针的指针输出一年中的12个月
#include<stdio.h>
main()
{
int i;
char **p;
char *month[]=
{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
}; /*给指针数组中的元素赋初值*/
for(i=0;i<12;i++)
{
p=month+i;
printf("%s\n",*p); /*输出指针数组中的各元素*/
}
}