C语言奇妙之旅_指针数组

指针数组概念

        一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。

一般形式

        数据类型 * 数组名[数组长度]

例如  

/*
* 编写时间:  2018/8/3
* 编写作者: 流光飞霞
* 程序功能:  指针数组
* 程序版本:  V0.1.00
**/

# include <stdio.h>

int main()
{
    int a[3][4] = 
         {
             {1, 2, 3, 4},
             {5, 6, 7, 8},
             {9, 10, 11, 12}
         };
    int * p = { a[0], a[1], a[2] };
    int * q = { a[0] };
    int i;

    for ( i = 0; i < 3; i++ )
    {
        printf ("%d, %d, %d\n", a[i][2-1], *a[i], *(*a+i)+i);
    }
    for ( i = 0; i < 4; i++ )
    {
        printf ("%d, %d, %d\n", p[i], q[i], *(p+i) );
    }
    

    return 0;
}

q是一个指针数组, 三个元素分别指向二维数组a的各行。 然后用for循环输出制定的数组元素。 

指针数组可以作为函数的参量使用,使用方式与普通数组类似。

指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。

数组指针

           

#include <stdio.h> 

int main(void)
{ 
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
    int (*p)[2] = (int (*)[2])a; 
    /*
        等号左边:声明并定义指针p为数组指针,指向的数组长度为2;
        等号右边:a为地址(&a也一样,仅仅是值一样)赋给p,(int (*)[2])为强制类型转换,将a 
        转换为和p一样的类型;
    **/

    printf("%d\n", **p); //输出结果是:1 (*p是p指向数组的首地址,*(*p)是首地址内存放的内容)

    printf("%d\n", **(*p+1)); //输出结果是:2(*p是p指向数组的首地址,*(*p+1)是数组的第二个元素地址内存放的内容)

    printf("%d\n", **(p+1)); /* 
                                 输出结果是:3 (p+1指向的的2元素数组为p指向2元素数组的下                         一个数组,*(p+1)是p+1指向的数组的首地址内存放的内容) 
                             **/

    printf("%d\n", *a); //输出结果是:1 (a为数组的首地址,首地址的内容)

    return 0; 
} 

/*
原文地址: http://blog.sina.com.cn/s/blog_605f5b4f0100x7jq.html
*/
#include <stdio.h> 

int main(void)
{ 
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
     int (*p)[2] = (int (*)[2])&a;  //a是数组首地址。 &a是指向数组的指针 
 
    printf("%d\n", **p); //输出结果是:1
    printf("%d\n", *(*p+1)); //输出结果是:2
    printf("%d\n", **(p+1)); //输出结果是:3
    printf("%d\n", *a); //输出结果是:1
    printf("%d\n", *(a+1));  //输出结果是:2
    printf("%d\n", *(a+9)); //输出结果是:10
    printf("%d\n", *(a+10)); //输出结果是:1244948是0012FF14的十进制表示方式,a+10超出了数组a的数组界限,*(a+10)返回的是数组的首地址
    printf("%p\n", *(a+10)); //输出结果是:0012FF14
    printf("%p\n", a);  //输出结果是:0012FF14,数组首地址
    printf("%p\n", &a); //输出结果是:0012FF14 指向数组的指针,内存的是数组的地址
    printf("%d\n", *(&a)); //输出结果是:1244948
    printf("%d\n", **(&a)); //输出结果是:1,*(&a)得到的是数组的地址,**(&a)是数组里面存的元素
    printf("%d\n", *(&a+1)); //输出结果是:1244988,&a+1是下一个10元素的int类型数组, *(&a+1)是下一个10元素int数组的地址,可以看到它比*(&a)大了40个字节=int的4个字节*10个int
    printf("%p\n", *(&a+1)); //输出结果是:0012FF3C 是 1244988的16进制表示

    return 0; 
}

/*
原文地址: http://blog.sina.com.cn/s/blog_605f5b4f0100x7jq.html
*/

以上两个程序是看了别人的博客"偷"来的, ↓面是链接, 有点懒了                  熬夜成瘾(,,•﹏•,,)

http://blog.sina.com.cn/s/blog_605f5b4f0100x7jq.html

数组指针是指向数组地址的指针,其本质为指针;

指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。

数组指针的使用在某些情况下与指针数组很相似,要注意区别。

猜你喜欢

转载自blog.csdn.net/qq_39637265/article/details/81394055