一道练习题的疑问

时间:2023-02-23 15:11:04
#include<stdio.h>
int main()
{
    int m[12],*p[3],k,sum=0;
for(k=0;k<12;k++)
{
m[k]=2*k;
if(k<3)
p[k]=m+2*k*k;
}
for(k=0;k<3;k++)
sum+=(*(p+k))[4-k];
    printf("%d",sum);
return 0;
}
(*(p+k))[4-k]对应着什么啊?

9 个解决方案

#1


p是指针数组
*(p+k)是索引为p+k的数组,然后对这个数组取下标为[4-k]的值

#2


你可以放断点,调试看;也可以printf出来看呀

#3


引用楼主 xinsipine 的回复:
#include<stdio.h>
int main()
{
  int m[12],*p[3],k,sum=0;
for(k=0;k<12;k++)
{
m[k]=2*k;
if(k<3)
p[k]=m+2*k*k;
}
for(k=0;k<3;k++)
sum+=(*(p+k))[4-k];
  printf("%d",sum);
return 0;
}
(*(p……

需要一个纸上作业过程:
1.先认识程序中的每一个变量(含数组)
m是一个有12个整型元素的数组
p是3个指针元素的数组,指针指向了整型数组(现在没有确切的指向)
k是循环变量
2.再看前一个循环过程
2.1.m数组的值应该是0,2,4,6,。。。,22
2.2.p数组的值应该是m,m+2,m+8,即指向了m数组中的m[0],m[2],m[8]
3.最后看后一个循环
3.1.先解读*(p+k):随着k=0,1,2;*(p+k)就是p[0],p[1],p[2],它们的值是指针&m[0],&m[2],&m[8]
3.2.再将(*(p+k))[4-k]解读为:k=0时,(&m[0])[4]即m[4]
    k=1时,(&m[2])[4-1]即从m的第二个元素起(记为0点)向后数3个,即m[5]
    k=2时,(&m[8])[4-2])即从m第八个元素起向后数2个,即m[10]

#4


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

#5


这个问题你得去看看《C和指针》当中,对指针和数组做对照的那段,才能明白C这个东西把[]语法设计得真乱套

#6


数组名就是 地址---就是指针---指向该数组的收地址

#7


给错分了!我是要给3楼的……

#8


引用 7 楼 xinsipine 的回复:
给错分了!我是要给3楼的……

嘿嘿!

#9


引用 8 楼 zhao4zhong1 的回复:
引用 7 楼 xinsipine 的回复:
给错分了!我是要给3楼的……

嘿嘿!

不厚道吧

#1


p是指针数组
*(p+k)是索引为p+k的数组,然后对这个数组取下标为[4-k]的值

#2


你可以放断点,调试看;也可以printf出来看呀

#3


引用楼主 xinsipine 的回复:
#include<stdio.h>
int main()
{
  int m[12],*p[3],k,sum=0;
for(k=0;k<12;k++)
{
m[k]=2*k;
if(k<3)
p[k]=m+2*k*k;
}
for(k=0;k<3;k++)
sum+=(*(p+k))[4-k];
  printf("%d",sum);
return 0;
}
(*(p……

需要一个纸上作业过程:
1.先认识程序中的每一个变量(含数组)
m是一个有12个整型元素的数组
p是3个指针元素的数组,指针指向了整型数组(现在没有确切的指向)
k是循环变量
2.再看前一个循环过程
2.1.m数组的值应该是0,2,4,6,。。。,22
2.2.p数组的值应该是m,m+2,m+8,即指向了m数组中的m[0],m[2],m[8]
3.最后看后一个循环
3.1.先解读*(p+k):随着k=0,1,2;*(p+k)就是p[0],p[1],p[2],它们的值是指针&m[0],&m[2],&m[8]
3.2.再将(*(p+k))[4-k]解读为:k=0时,(&m[0])[4]即m[4]
    k=1时,(&m[2])[4-1]即从m的第二个元素起(记为0点)向后数3个,即m[5]
    k=2时,(&m[8])[4-2])即从m第八个元素起向后数2个,即m[10]

#4


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

#5


这个问题你得去看看《C和指针》当中,对指针和数组做对照的那段,才能明白C这个东西把[]语法设计得真乱套

#6


数组名就是 地址---就是指针---指向该数组的收地址

#7


给错分了!我是要给3楼的……

#8


引用 7 楼 xinsipine 的回复:
给错分了!我是要给3楼的……

嘿嘿!

#9


引用 8 楼 zhao4zhong1 的回复:
引用 7 楼 xinsipine 的回复:
给错分了!我是要给3楼的……

嘿嘿!

不厚道吧