黑马程序员技术交流社区

标题: 数组和指针 [打印本页]

作者: 执着的土豆    时间: 2014-4-26 22:06
标题: 数组和指针
本帖最后由 执着的土豆 于 2014-4-26 23:20 编辑

数组指针和指针数组的区别,以及两者的主要用途是什么,好困惑啊,最好是有例子

非常感谢各位同学的回答,讲的很详细,很透彻,已经懂了。

另外:由于网络卡了,所以发帖的时候发了两个,还请求板主将另一个帖子删掉。 非常感谢!

作者: 星河鹭起    时间: 2014-4-26 22:39
数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n。

如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组
定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。

数组指针只是一个指针变量,是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
作者: liulinjie    时间: 2014-4-26 22:41
数组指针是指向一个数组的指针, 比如
int a[3] = {0, 1, 2};
int *p = a;  
p 就是指向数组a的指针, 可以使用 p 来访问数组 a 中的值, 比如修改数组元素 *p = 10; 或者访问数组元素 printf("%d", *(p+1));

指针数组是装指针的数组, 比如
int x = 10, y = 20, z = 30;  
int *p[3] = {&x, &y, &z};
这个 p 就是一个指针数组, 它的每一个元素 p[0] p[1] p[2] 都是一个 int 指针。 可以修改指针元素指向的地址, 比如 p[0] = &y;  可以通过指针来访问或修改指向的变量的值, 比如 *p[1] = -20;

作者: peku    时间: 2014-4-26 22:42
本帖最后由 peku 于 2014-4-26 22:47 编辑

数组指针:例如int (*p)[n],相当于int X[n],*p=X---p是一个数组指针,强调了p是一个指针,指针必然会指向一个别的对象,这里的对象是一个整型的一维数组,这个一维数组的长度是n,数组指针主要通过运算后用来访问指向数组各个元素,比如p指向这个int数组的第一个元素
指针数组:例如int *a[n],你可以这样看,(int *)a[n],a[n]是一个指针数组,强调了a[n]是一个数组,前面的(int *)表示这个数组内的元素是指向整形对象的指针。所以这里有n个指针,可以指向n个整形对象,建立指针数组主要是利用了数组的特性,当需要对多个有关联的指针进行操作时,为了便于管理和操作可以用指针数组。
具体你可以看看下面这篇文章
http://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html

作者: gaoxinglei123    时间: 2014-4-26 22:47
int *p[5]定义指针数组是指一个数组里面元素是几个指向整型元素的指针。int (*p)[5]定义一个指向5个元素的数组的数组指针,这个语句只是定义了一个指针变量p。数组指针与普通指针的区别,你可以参考char *p和 int *p的区别,指针变量在64位系统里都是8个字节保存。区别在指向的单元,一个是字符类型,一个是整型。char *p中的p+1是在真实物理地址上加个单元长度即1。int *p的p+1则表示真实物理地址加个单元长度,因为是int,所以加4。同理数组指针的p+1就是真实物理地址上的加上数组的长度
作者: 执着的土豆    时间: 2014-4-26 23:12
星河鹭起 发表于 2014-4-26 22:39
数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这 ...

看完,想了10分钟,对照你讲的,做了个练习,练了20分钟。很详细。非常感谢!!!    大彻大悟了。  
作者: 执着的土豆    时间: 2014-4-26 23:16
非常感谢各位高手给予解惑,明白的很透彻,还要日后练习。 还要写博客,就不一一回复了,还望见谅。再次感谢!   
作者: jiangenhao    时间: 2014-4-26 23:23
二楼大神啊 说的太详细了 比我们老师讲的都好 这是在哪看的啊?视频里有吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2