C语言指针知识点(三):指针数组与数组指针

1.指针数组

即指针的数组,本质是一个数组,数组的每个元素都是指针变量

定义指针数组,含有4个元素,每个元素都是一个char *类型的指针,指向字符串

char *p[] = { "lemon","C language","hello world","=.=!" };

直接将p[0],p[1]等当作普通指针使用:

for (int i = 0; i < sizeof(p) / sizeof(char *); i++)//sizeof(p) / sizeof(char *)为求指针数组的元素个数
    {
        printf("%s\t", p[i]);
    }

    printf("\n");

    for (int i = 0; i < sizeof(p) / sizeof(char *); i++)
    {
        do
        {
            printf("%c", *(p[i]));//p[i]表示第i个字符串的指针,外面加*代表取该指针指向的内容
            p[i]++;//p[i]++表示指向该字符串的指针向后移动一位
        } while (*(p[i]) !='\0');
        printf("\n");
    }

输出结果为:

2.数组指针

即指向数组的指针,本质是一个指针,指向一个数组

2.1一维数组

int a[10] = { 0 };//定义一个一维数组

定义数组指针的三种方式:

(1)先定义数组类型(使用typedef),再根据数组类型定义数组指针变量

typedef int A[10];//定义了一个数组类型A,该类型的数组有且只能有10个元素
    A *p1 =NULL;//使用数组类型定义一个指针变量p1,初始化为NULL
    p1 = &a;//使用&a,让p1指向整个数组,不能使用p1=a,a是首元素地址
    //使用
    for (int i = 0; i < 10; i++)
    {
        //p=&a
        //*&a <==> a
        //*p=*&a ==> (*p)[i]=a[i]  ()与[]优先级相同,从左到右结合,*优先级较低
        (*p1)[i] = i+1;
        printf("%d  ", (*p1)[i]);
    }

输出结果为:

(2)先定义数组指针类型,再根据类型定义变量

typedef int(*P)[10];//定义了一个数组指针类型P
    P p2 = NULL;//使用定义的数组指针类型P,定义了一个数组指针变量p2,初始化为空
                //p2只能指向一个有10个元素的int型一维数组
    p2 = &a;//将数组a的数组地址赋值给p2
    //使用相同
    for (int i = 0; i < 10; i++)
    {
        (*p2)[i] = i + 2;
        printf("%d  ", (*p2)[i]);
    }

输出结果为:

(3)直接定义数组指针变量

int(*p3)[10] = &a;
    //使用相同
    for (int i = 0; i < 10; i++)
    {
        (*p3)[i] = i + 3;
        printf("%d  ", (*p3)[i]);
    }

输出结果为:

2.2二维数组

    int b[][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//定义一个三行四列的二维数组

    //定义一个指向一维数组的数组指针变量,并初始化为空
    int(*p4)[4] = NULL;
    p4 = b;//将二维数组b的第0行的首行地址赋给p4
    //这里不能使用p4=&b,&b指的是整个二维数组,定义的是一维数组指针
    //使用
    for (int i = 0; i < sizeof(b) / sizeof(b[0]); i++)

        //sizeof(b)是求整个数组的大小,sizeof(b[0])是求第0行的大小
        //sizeof(b) / sizeof(b[0])即可得到数组有多少行
    {
        for (int j = 0; j < sizeof(b[0]) / sizeof(b[0][0]); j++)

            //sizeof(b[0][0])是求第0行第0个元素的大小
            //sizeof(b[0]) / sizeof(b[0][0])即可得到每行有多少个元素
        {
            printf("%d  ", p4[i][j]);
            //等价于printf("%d  ", *(*(p4+i)+j));
        }
        printf("\n");
    }

输出结果为:

关于b和&b的区别,p4[i][j]与*(*(p4+i)+j)等价的详细介绍
可见https://blog.csdn.net/Lemon_jay/article/details/83007589

猜你喜欢

转载自blog.csdn.net/Lemon_jay/article/details/83015005