永发信息网

C语言{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},b[4]={1,3,5,7}*p=b,**q=a

答案:1  悬赏:50  手机版
解决时间 2021-01-09 23:32
  • 提问者网友:临风不自傲
  • 2021-01-09 16:02
C语言{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},b[4]={1,3,5,7}*p=b,**q=a
最佳答案
  • 五星知识达人网友:鱼芗
  • 2021-01-09 16:09
首先,a是一个二维数组,b是一个一维数组。
p是一个指针,它指向的是b的首地址,不是指向整个b数组,所以你从地址p那里取到的数据应该是 1,而不是1,3,5,7
a = 1,3,....21,23这句完全不对,没有这种说法。
a[1]是指向二维数组a的一个地址,a[0]才是指向第一行的地址。
还有,没有**q=a这种写法,会报警告的,因为a指的是int (*)[4],而p是二维指针!追问题干上就是**q=a,(那里q=1,3.....打错了)**q是二级指针啊,这里就是数组和指针的相互引用,我就想问输出结果是什么,还有a[0],是第一行的所有地址么,顺便求问大侠,*a+1是非法的么?*(a+1)是指等价于a[1]的,那么*a+1,能不能看成a[0]+1,然后得到a[1]追答问题有点多啊。。。
*a + 1是合法的,首先,a是一个二维数组,你的*a是指向数组a的首地址,例如:
printf("a = %d\n",*(*a));打印出来的值是1。
然后*的优先级比+的优先级高,也就是程序中的操作将会是先得到一个地址,然后会让地址往后移动一个单位,比如说这里, *a的地址打印出来为0018FF18(printf("a = %p\n",(*a));),然后*a + 1的地址打印出来时0018FF1C,由此可见,这里是*a往后移动了4个字节(int类型为4个字节)也就是从a[0][0]移动到了a[0][1],所以是合法的(printf("a = %d\n",*(*a + 1));)。
a[0]指的是第一行的第一个数据的地址,没有指向一堆数据的地址这种说法(除非是结构体指针或者之类的)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯