关于数组指针和 指针数组,相信狠很多同学对此疑惑过,今天我们来把他们分个清楚!
首先,让我们从字面意义上理解他们:
指针数组 本质呢 是数组!
数组指针 本质呢 是 指针!
(PS:你可以认为后俩字是什么,它本质就是什么! 语文的知识吧?宾语?(*^__^*) )
搞清楚此点之后呢,我们就可以继续来讲了,其实呢,指针数组本身就是个数组,只不过呢,它里面存放的数据类型不是int,也不是char这类基本类型,而是一个指针类型,说白了就是地址,所以叫指针数组! 记住:是存放指针的数组!
那么理解这个之后,数组指针也一样的道理,它呢本质是个指针,只不过是指向一个一维数组的指针,也称之为“行指针”,前提呢,是这个一维数组的长度和这个数组指针的长度要一致才可以赋值。
下面我们通过代码来理解:
////////////////////////////////////////////////////////////////////////// //Name: 测试 数组指针 与 指针数组 //Author:C语言研究中心(www.dotcpp.com) //time:2015/5/28 ////////////////////////////////////////////////////////////////////////// #include<stdio.h> int fun() { char *p1[10]; // 指针数组 char (*p2)[10]; //数组指针 //10个char变量 char a1[10]={'1','2','3','4','5','6','7','8','9','\0'}; //两个长度为10的一维数组 char a2[2][10]={{'q','w','e','r','t','y','u','i','o','\0'},{'a','s','d','f','g','h','j','k','l','\0'}}; //将十个char类型变量的地址依次放到指针数组里 p1[0]=&a1[0]; p1[1]=&a1[1]; //... p1[8]=&a1[8]; //验证输出 printf("%c\n",*p1[0]); printf("%c\n",*p1[1]); //... printf("%c\n",*p1[8]); ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //将一维数组的地址放到数组指针里 p2=&a2[0]; printf("%s\n",p2); printf("%s\n",p2+1);//注意此处+1为加一行! return 0; }
怎么样?能看明白吗?运行结果如下:
如果您通过注释看懂这段代码后,想必应该就清楚数组指针和 指针数组的区别了。
最后我们总结数组指针和指针数组的区别如下:
1、本质不同,一个是数组,一个是指针
2、数组指针是一个变量,指针数组是N(数组长度)个变量
C语言研究中心(www.dotcpp.com)