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

[C语言]二维数组与指针

程序员文章站 2022-07-07 11:52:30
...

二维数组与指针

1 二维数组初始化

以下几种赋值方式均可。

    int a[4][4] = {0};
    int a[4][4] = {1,2,3,4,5,6};
    int a[4][4] = {{1,2,3},{4,5},6} //其他元素都为0;
    int b[][4] = {{1,2},{3,4}}; //第一维可以省略,第二维不能省略

2 遍历

//用一个for遍历
int c[3][4];
for(int i = 0; i<12; i++)
    c[i/4][i%4]=i;
//用两个for遍历
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%4d",c[i][j]);
        }
        printf("\n");
    }

3 用数组名访问

对于int a[3][4]; a是数组名,是第0行第0个元素的地址。

用加号(+)(偏移量)的方式得到的都是地址,不是元素!

a + i是地址,a[i]+j也是地址!

a[i]是第i行的起始地址a[i] == a + i == &a[i][0[ .

a[i][j]是第i行的第j个元素a[i][j] == *(a[i] + j) == *(*(a+i) + j)

4 用int *指针访问

    int arr[5][5];
    int *parr = (int *)arr;
    int count = 0;
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            arr[i][j] = count++;
        }
    }
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%3d",*(parr+i*5+j));
        }
        printf("\n");
    }

4 * 用指向数组的指针访问

int arr[5][5];
数组名arr不是二级指针!二维数组不等于二级指针!

二维数组arr可用看作是5个一维int[5]数组在内存里连续堆叠形成的,因此若想用指针来访问,需要定义一个指向int[5]数组的指针。

int (*ptrarr)[5];
ptrarr = arr; // arr == arr[0] 二维数组的起始地址

或者

int (*ptrarr)[5] = arr;

ptrarr 是一个指针,指向int[5]数组。

*ptrarr 是一个int[5]数组,是这个数组的数组名,因此访问该数组内的元素的方法是 (*ptrarr)[i] 或者是 *((*ptrarr)+i) 。这里要注意,前者的写法不能写成 *(ptrarr)[i] ,因为 [ ]( ) 的优先级是高于 * 的。

PS: ptrarr*ptrarr 的值是相同的,但是意义不同。他们的值都是arr[0]的地址,但是 ptrarr 是指向数组的指针, *ptrarr 是数组名。

因为 ptrarr 是一个指向int[5]数组的指针,所以 ptrarr 可以进行加减运算,当 ptrarr = arr[0] 时, 执行 ptrarr++ 后, ptrarr 就指向了 arr[1] 。因此可以用 *(ptrarr+i) 来表示arr[i]。

若要表示二维数组中的元素,可以采用以下几种方式:

ptrarr  // 指针
*ptrarr //int数组
*(ptrarr+i)  // 二维数组中第i个一维数组
(*(ptrarr+i)+j)//第i个一维数组中第j个元素的地址
*(*(ptrarr+i)+j) == (*(ptrarr+i))[j] == *(ptrarr[i]+j) == ptrarr[i][j] //第二个写法一定要加括号,否则[j]先于*取值运算

当指针用 [i] 运算时,等同先加偏移量再取值。

相关标签: C/C++