作业帮 > 综合 > 作业

关于C语言二维数组指针的疑问

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/14 05:09:50
关于C语言二维数组指针的疑问
定义一个二维数组int a[i][j],由定义可知a=&a[0][0]=a[0],由于a可看成是带有i个一维数组元素的数组,所以由一维数组的情形可推知a[i]=*(a+i)和a+i=&a{i]和a=&a[0],即有a=&a[0]=a+0=&a[0][0]=a[0]=*(a+0)=*a.可是这样推的话就有&a[0]=a[0],这是怎么回事?另外,a+1即为a[1]的地址,a[1]的地址又等于a[1],而a[1]+1即为a[1][1]的地址.那么a+1+1是a[2]的地址还是a[1][1]的地址?
同学貌似没有理解指针和数组,指针就是指针 数组就是数组 只不过他们有些运算是相同的而已;
你的问题要从一级指针开始讲起:
比如 int a【3】,这是一个数组,里面存放的是3个整形的变量,也就是说,计算机在栈区中划分出了一块连续的内控空间,这个空间的大小(长度)是3个sizeof(int)的大小,就是12个字节,并且把这段空间取名字叫做 a,现在&a就是这块内存空间的首地址的了,就是数组的首地址.而a[0]是这个数组的第一个元素,&a[0]就是这个数组第一个元素的地址,那么肯定也就是这个数组的首地址了.因此这样看来&a和&a[0]是一样的.
但是你要注意的是:&a+1是这个数组的首地址+1,那么就是移动了3*sizeof(int)的长度,就是12个字节,&a[0]是首元素的地址+1,只移动了1*sizeof(int)的大小,就是4个字节,这是不同的.
好了,现在你看看二维数组,你自己说二维数组相当与是存放一位数组的数组.那么,可以这样理解,比如int a[3][3],可以看成int (*a)[3] 也就是一个指针数组.(因为你可以把以为数组看成指针,里面存放的是整数;那么二维数组也相当于一个指针,里面存放的是数组罢了);跟以为数组的分析类似:这个二维数组看成数组指针的话,它指向的是 int 【3】,那么&a+1就是移动3*3*sizeof(int)的长度,a+1就是移动3*ssizeof(int)的长度,a[0]+1就是a[1][0],a[1]+1就是a[2][0], 但是a[0][0]+1只是移动sizeof(int)*1的长度,就是说a[0][0]+1就是a[0][1];
就这样了 楼主自己好好看看 要靠自己