|
发表于 2020-9-2 16:31:28
|
显示全部楼层
本帖最后由 风过无痕1989 于 2020-9-2 16:41 编辑
看来你还是没有理解指针数组,下面这个程序是我为了帮助自己理解、记忆而写的,每一条语句都是通过运行通过的,送给你吧:
- // 输出二维数组的有关数据
- #include <stdio.h>
- int main()
- {
- int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
- int *p,i,j;
- p = a[0];
- printf("%d\t%d\t%d\t",a,*a,p); //0行首地址和0行0列元素地址
- printf("//0行首地址和0行0列元素地址\n");
- printf("\n");
- printf("%d\t%d\t%d\t",a[0],*(a + 0),(p + 0)); //0行0列元素地址
- printf("//0行0列元素地址\n");
- printf("\n");
- printf("%d\t%d\t%d\t",&a[0],&a[0][0],&p[0]); //0行首地址和0行0列元素地址
- printf("//0行首地址和0行0列元素地址\n");
- printf("\n");
- printf("%d\t%d\t%d\t",a[1],a + 1,p + 4); //1行0列元素地址和1行首地址, p + 4才是指向1行0列
- printf("//1行0列元素地址和1行首地址, p + 4才是指向1行0列\n");
- printf("\n");
- printf("%d\t%d\t\t",&a[1][0],*(a + 1) + 0); //1行0列元素地址
- printf("//1行0列元素地址\n");
- printf("\n");
- printf("%d\t%d\t%d\t",a[2],*(a + 2),p + 8); //2行0列元素地址, p + 8才是指向2行0列
- printf("//2行0列元素地址, p + 8才是指向2行0列\n");
- printf("\n");
- printf("%d\t%d\t\t",&a[2],a + 2); //2行首地址
- printf("//2行首地址\n");
- printf("\n");
- printf("小结:指针是按存贮方式指向,p + 1则指向0行1列,p + 2则指向0行2列\n");
- printf("因此,a[i][j]在数组中的地址为:p + (i * m + j),(每行有 m 个元素)\n");
- for (p = a[0];p < a[0] + 12;p++) // 使 p 依次指向下一个元素
- {
- if((p - a[0]) % 4 == 0) // p 移动4交换行
- {
- printf("\n");
- }
- printf("%4d",*p); // 输出 p 指向的元素的值
- }
- printf("\n");
- printf("\n");
- p = a[0];
- scanf("%d,%d",&i,&j); // 指定要输出的数组的行和列
- printf("a[%d,%d] = %d\n",i,j,*(*(a + i) + j)); // 输出指定元素的值
- printf("a[%d,%d] = %d\n",i,j,*(p + i * 4 + j)); // 输出指定元素的值
- return 0;
- }
复制代码
|
|