欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c语言二维数组与指针的关系

程序员文章站 2022-07-07 11:37:04
...

今天写代码用到了二维数组,

int **p;
int a[3][2];
p=a;

发现是不对的,那对于二维数组我应该怎么与指针建立联系呢,仔细研究了一下发现挺有意思的,又加深了我对于指针的理解

  1. 二维数组的数组名是不是指针,里面存放的是谁的地址?
    看下面的代码
#include<stdio.h>
#include<stdlib.h>
int main(){
    int a[4][2]={{1,2},{3,4},{5,6},{7,8}};
    printf("a的值   %d\n",a);
    printf("&a[0]的值  %d\n",&a[0]);
    printf("a[0]的值  %d\n",a[0]);
    printf("&a[0][0]的值   %d\n",&a[0][0]);
}

c语言二维数组与指针的关系
我们发现这些值都是相同的,那说明二维数组名是一个指针,里面存放的是a[0][0]的地址
但是&a[0]为什么与a[0]的值相同呢?
我们再看

#include<stdlib.h>
int main(){
     int **p;
      int a[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
      p=a;
}

c语言二维数组与指针的关系
程序可以运行但是返回一个warning,
assignment from incompatible pointer type
意思是来自不兼容指针类型的赋值
我们修改一下

#include<stdlib.h>
int main(){
     int *p;
      int a[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
      p=a;
}

运行后发现还是有这个warning,意思是说,a代表一个指针,但是这个指针和指针p或者二级指针p类型都是不一样的,我们再来看

#include<stdio.h>
#include<stdlib.h>
int main(){
      int a[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
      printf("a  %d       &a[0][0] %d\n",a,&a[0][0]);
      printf("a+1  %d       &a[0][0]+1  %d\n",a+1,&a[0][0]+1);
      printf("*a+1  %d       &a[0][0]+1  %d\n",*a+1,&a[0][0]+1);
}

c语言二维数组与指针的关系
我们可以发现,都执行加1操作,但是移动的地址是不一样的,对于a来说,我+1,但是地址加了20(4*5=20)
所以说,虽然a与&a[0][0]的值相同,但是a指向的是一行,每次加减都是20个字节。可以这么理解,指针存放的是地址,相同类型的指针必须存放相同类型的地址,
除了 double *p 与int *p这样的区别外,还有同样是int 但是有的地址表示的是20个字节为一个整体的地址,有的呢表示的是四个字节为整体的地址。
所以说int a[3][5]; =>int[5] a[3]; 令type为int [5],所以int[5] a[3]为type a[5],这说明,a是一个一维数组,有3个元素;每个元素是type,即int [5]类型的。

  1. 那我们如何使用指针呢

有两种方式
1.

# include <stdio.h>
int main(void)
{
    int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int i, j;
    int *p = &a[0][0];  //把a[0][0]的地址赋给指针变量p
    for (i=0; i<3; ++i)
    {
        for (j=0; j<4; ++j)
        {
            printf("%d\n", *(p+i*4+j));
        }
        printf("\n");
    }
    return 0;
}
# include <stdio.h>
int main(void)
{
    int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int i, j;
    int (*p)[4] = a;  //记住这种定义格式
    for (i=0; i<3; ++i)
    {
        for (j=0; j<4; ++j)
        {
            printf("%d\n", *(*(p+i)+j)); 
        }
        printf("\n");
    }
    return 0;
}

有些是看别人的才明白,大家也可以看大佬的理解理解
感谢
感谢

相关标签: c语法