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
结果是多少,是直接p=1,3,5,7a=1,3,....21,23么,还有这里a[1]是不是指第一行的首地址,不能确定具体的值?...
结果是多少,是直接p=1,3,5,7 a=1,3,....21,23么,还有这里a[1]是不是指第一行的首地址,不能确定具体的值?
展开
1个回答
展开全部
首先,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是二维指针!
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]指的是第一行的第一个数据的地址,没有指向一堆数据的地址这种说法(除非是结构体指针或者之类的)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询