关于指针和数组的一些问题(站内消息回复不了,所以搬过来立贴)
备注:由于站内短信字数限制、能且只能发些简短的文字。这个问题我用短消息无法回复,所以现将聊天记录粘贴至此并回复。不过我个人建议其他网友以后善用“站内短信”功能,尽量不要用短信来提问题,因为这样你的问题就只有交流双方看得到,不能共享给其它网友,也听不到更多的声音,容易两个人聊一聊就一起“顺拐”了,错了都不知道。还是集思广益好。站内短信你可以用于联系某篇帖子的当事人简要地与他交流一下他的发言,并不适用于你向他提问题。提问题应该在论坛发帖子。一方面,论坛不是学校不是公司,谁也不会24小时在线,确保及时给你回复,立帖子出来,别人也可以看到,谁都可以参与;另一方面,每一个人遇到的每一种状况其实都有前人踩过坑,也还会有其他人即将进坑,把这个问题从开始到解决的完整过程记录下来,后人就可以通过读贴自行解决问题了(我想这也是论坛之所以要保留有好几年前的旧帖子的原因了,可惜,没什么人去翻)
-------------------------------------------------------------------
zhushengnann 4 天前 17:35(如果需要匿名,请联系我)
int a[3][3]={1,2,3,4,5,6,7,8, 9}; printf(\"%d\",*(&a[2][0]-1)); 解释下输出语句,谢谢了
-------------------------------------------------------------------
书生牛犊 3 天前 18:26
&a[2][0]-1==&a[1][2]
*(&a[2][0]-1)==*(&a[1][2])==a[1][2]
至于前面的\\\"%d\\\" 这在我的软件上不能编译是个ERROR错误。
必须修正成 printf(\"%d\",*(&a[2][0]-1));才能看到运行结果 6
-------------------------------------------------------------------
书生牛犊 3 天前 18:32
你能遇到这样的代码,我默认你是知道 多维数组在内存中的实际存储情况,也做过用一维数组的方式去访问二维数组的测试
比如 int a[3][3]={0};int *p=a;
&p[i*3+j]==&a[i][j];
如果你看得懂我写的这两行代码并理解他为什么是这样的,我想你就能理解 &a[2][0]-1==&a[1][2]了。
至于\\\" 这是个转义字符,通常用在scanf或者printf的双引号之内。如果你给的代码确信没问题。那我也不知道是怎么回事。我刚学编程也才一年,懂得不多。
-------------------------------------------------------------------
zhushengnann 前天 21:13
谢谢
int a[3][3]={0};int *p=a;//这个是二维数组的都是0吗?//1
&p[i*3+j]==&a[i][j];//i*3+j我不懂。数组下标最多到2吧,解释下。新手自学,糊里糊涂的,谢谢你了 //2
-------------------------------------------------------------------
zhushengnann 前天 21:26
int k=2;*p1=k,*p2=k; p1=*p2;和*p1=p2怎么解释 //3
-------------------------------------------------------------------
zhushengnann 前天 21:35
int *p=&ha; 和*p=a;两句的*p含义相同么?都是在对p进行同时初始化吗?第二个不是在给他赋值吗? 将变量a的值赋给指针变量p,和将变量a的值赋给*p!!这两句话有差吗? //4
-------------------------------------------------------------------
zhushengnann 前天 21:55
https://bbs.bccn.net/thread-469528-1-1.html# //此贴已由管理员关闭,原因未知
-------------------------------------------------------------------
zhushengnann 昨天 01:07
http://www. 这里面解释有问题吗? //5
-------------------------------------------------------------------
zhushengnann 昨天 01:11
p是一个二维数组,二维数组在内存中是连续存储的.
*(p[i]+j)
p[i]表示的是指向第i行的指针,是int*型的.所以*(p[i]+j)其实和p[i][j]是一样的.
*(*p+i)+j)
这个少了个括号,应该是*((*p+i)+j)或者是*(*(p+i)+j)
如果是*((*p+i)+j)的话,*p指向的是第一行元素,那么这个式子其实就是*(p+i+j).就是从第一个元素开始数i+j个元素.
如果是*(*(p+i)+j)的话,这个其实和p[i][j]一样.
(*(p+i))[j]
p+i可以看成是p移动i行,解引用后指向第i行元素的首地址.下标运算[j]就是取第j个元素.和p[i][j]一样.
-------------------------------------------------------------------
zhushengnann 昨天 01:12
*(&p[0][0]+2*i+j)
&p[0][0]是取p[0][0]的地址,返回的是一个int*指针.+2*i+j其实就是从第一个元素开始向后移动2*i+j个元素.
*(p[0]+2*i+j)
这个其实是和*(&p[0][0]+2*i+j)一样的,因为p[0]和&p[0][0]都是指向第一行的元素,两个都是int*指针.地址一样的
-------------------------------------------------------------------