黑马程序员-C-二维数组&指针数组&二维数组指针

来源:互联网 发布:南京未来造价软件 编辑:程序博客网 时间:2024/04/30 22:30

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、二维数组:a[3][5]

因为二维数组可以看作是一个特殊的一维数组:每一行的单个元素是一个一维数组。如a[3][5],有3个元素,每个元素是一个含有5个元素的一维数组。所以a[0],a[1]就分别代表第一、二行的地址。

a = &a[0] = &a[0][0] = a[0] —> 第一行地址 = 第一列第一个元素地址
a + 1 = &a[1] = &a[1][0] = a[1] —> 第二行地址 = 第二列第一个元素地址
a + 2 = &a[2] = &a[2][0] = a[2] —> 第三行地址 = 第三列第一个元素地址

a[0] = a = &a[0] = &a[0][0] ——> 第一列地址
a[0] + 1 = &a[0][1] ——> 第二列地址
a[0] + 2 = &a[0][2] ——> 第三列地址
a[0] + 3 = &a[0][3] ——> 第四列地址
a[0] + 4 = &a[0][4] ——> 第五列地址

#include <stdio.h>int main(int argc, const char * argv[]) {    int a[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};    //二维数组//    由上分析知,a[0],a[1],a[2]也是代表第一、二、三的地址,则a[1]+2代表a[1][2]的地址,即&a[1][2]//    i代表行,j代表列。则a[i] = *(a + i), a[i][j] = *(*(a + i) + j)//    遍历数组    for (int i = 0; i < 3; i++) {        for (int j = 0; j < 5; j++) {            printf("%d\t", *(*(a + i) +j));        }    }//    ************************************************************/*    一维指针数组定义格式:        类型名称 *数组名[数组长度]    如 int *p[5],表示这个一维指针数组,含有5个指针,这些指针指向整型数据的地址。    记忆方法:运算符的优先级 []大于*,所以其相当于*(p[5]),p[5]是一个数组,说明其首先是一个数组,然后是一个装有指针的数组。它的作用是一个指针集合。    注意:因为此外p是指针数组的首地址,所以其是一个二维指针。 */    int b, c, d;    b = 1;    int *p[3] = {&b, &c, &d};  //p = &p0 , p[0] = &b    //下面两句代码输出地址相同    printf("%p\n", p[0]);    printf("%p\n", &b);    //下面两句代码输出地址相同    printf("%p\n", p);    printf("%p\n", &p[0]);    //下面两句代码输出地址相同    printf("%d\n", *p[0]);    printf("%d\n", **p);    //因为此外p为二级指针,所以其可以指向二维数组//    **************************************************************/*    二维数组指针    1.定义格式: 数据类型 (* 指针变量名称)[指向的二维数组列数]     如 int (*p)[3], 表示指针p可指向列数为3的整型数组。    2.用途    二维数组指针是一个行指针,用来指向二维数组的每一行,存放的是行的首地址 */    int a3[2][3] = {1,2,3,4,5,6};    int (*p3)[3] = a3;      //给二维数组指针p3赋值,使其指向二维数组a3    //遍历数组a3,可用指针p3代替数组名a3,这在需要变量的情况有用,因为可以p3++,而不可以a3++,因为a3是常量    for (int i = 0; i < 2; i++){        for (int j = 0; j < 3; j++) {            printf("%d\t",*(*(p3+i)+j));        }    }    return 0;}
0 0
原创粉丝点击