数组指针与指针数组的区别2008-03-09 14:08int (*p)[10];

定义了一个数组指针,这个指针与一般的指针没有什么区别,仅仅是这个指针指向一个数组。这里我们把数组作为了基本的元素处理。也就是说,将整个数组作为一种类型,而数组名就是这个类型的一个具体变量。例如:

int a[10];

一个数组类型,形状就是这样:int [10];a就是新定义的一个变量。

int b[3];

一个数组类型,形状就是这样:int [3];b就是新定义的一个变量。

因为这两个类型形状不一样,因此是两个不同的类型,因此a,b就是不同类型的变量。这就好比int a和double b :a和b不一样。不知道大家是否已经对数组类型有了基本的印象?

那么把数组名作为该数组类型的一个具体变量,我们就可以定义指向这个变量的指针,即数组指针。

对于数组类型:int [10],我们可以定义一个指针,int (*p) [10].注意这里一定要加上小括弧。否则就会变成了指针数组。定义了指针之后,我们可以对该指针赋值,如p=&a;如果定义了一个二维数组,int c[3][10]。我们可以认为定义了一个一维的数组,这个数组有三个int[10]的元素。因此和一般的数组一样,我们可以将该数组名赋给指针,其实也就是第一个元素的地址付给指针。即: p=c;或者p=&c[0]。其余情况以此类推。

---------------------------------------------------------------

数组指针是指针类型,它指向一个数组,代表数组的首地址。

指针数组首先是一个数组,只不过这个数组的元素是指针而己。

---------------------------------------------------------------

下面的程序有错误嘛?为什么?

#include<iostream.h>

void main(){

  int *p=new int [10];

  int arr[10];

  int (*ptr)[10];

  ptr=p;

  ptr=arr;

  ptr=&arr;

  typedef int (*type)[10];

  type pa=&(new int[10]);

  int* pb;

  type pc=&(pb=new int[10]);

  type pd=(type)(new int[10]);

}

-------------------------------------------------------

ptr=&arr;

type pa=&(new int[10]);

type pc=&(pb=new int[10]);

窃以为此三句对。

---------------------------------------------------------------

你说:int a[90]; a是个变量,那么要分配内存,那么a有地址吗?&a???

---------------------------------------------------------------

数组指针是定义的一个指针,而指针所指的对象是一个数组,指针指向该数组的首单元的地址,它对数组的内部元素的属性不了解,只是规定了首单元的地址,通过它可以找到该数组。

    指针数组指的是一个数组,它其中的所有元素都是指针类型,这里所有指针都指向不同的地址,而所指地址的数据也不一定相同,但是必须属于同一数据类型。

    二者相差很多。

---------------------------------------------------------------

ptr=p;//将ptr指针指向p,错误!

  ptr=arr;//将ptr这个数组指针指向int arr[10]数组的首址,错误!

  ptr=&arr;//将ptr指向哪里?不清楚~~

  ptr应该是一个指向int型一维数组的首行才对!

  不知道我说道的对不对啊?

---------------------------------------------------------------

ptr=p; 数组指针与指针数概念浑淆

ptr=arr; 同上

type pa=&(new int[10]); 没见过

type pc=&(pb=new int[10]);   数组指针指针数组概念浑淆

---------------------------------------------------------------

指针指向类型不同的,说白了就是相邻的两个指针的之间的距离因为指针的类型不同而有所不一样的。

---------------------------------------------------------------

数组指针是指向数组的,

如: int a[3][3],(*p)[3];

    p=a;

这里(*p)[3]用于告诉编译系统,它是一个指针,指向一个长度为3的整型数组。这样在用指针访问其所指向的内存单元的时候就可以用*(*(p+i)+j)来表示a[i][j];

若:int a[3][3],*p;

    p=a;

就需用:*(p+3*i+j)来表示a[i][j].

指针数组是这样一种特殊的数组:它的每一个数组元素都是一个指针。

如:int *p[3];

*p[0],*p[1],*p[2]都是一个指针。

---------------------------------------------------------------

to : elvahuang(elva) (   )

我想你应该明白汇编中的label使用吧。他不占用变量内存,但是却能和变量一样引用内存。呵呵,这样的话,你的那个问题应该没有问题了吧。

---------------------------------------------------------------

int a[10];

a是个变量,它的值是&a(它自己的地址)。

---------------------------------------------------------------

我看了你所说的有关指针问题的看法,我非常同意你所说的.

其实我也有一点看法:所谓指针数组吗,其实就可以把他看成一个结构提指针,只是他里面的元素都是相同的类型.例如:int (*p)[22];p就是指向一个由10个整型单元构成的数组的指针.p必须是指向由10个整型单元构成的数组,就如一个结构体指针必须指向与它相同类型的一个结构体一样

---------------------------------------------------------------

我在vc上调了一下,只有

ptr=&arr;

type pd=(type)(new int[10]);// 但是此句会有警告.

确实如xiaoluoli(C/C++思考) 所说,对于int(*p)[10]编译器会把p看作一个类似于指向结构的指针,所以其它赋值语句都是错的.

---------------------------------------------------------------

数组就是const指针,但是规定了范围,分配了空间而已

---------------------------------------------------------------

前言:

其实数组也就是一个逻辑上的拥有首地址的连续的内存空间。

1。我们常常用改变下标的方式来访问数组,本质上和通过加减某种特定类型的

指针来实现在逻辑内存上的跳跃是相同的,其实数组的越界和程序员通过指针

强行访问逻辑内存是一样的原理,只是指针更加灵活,同时也带来的大量的

安全性问题。

2。而对于诸如   int*(*p)[i]   这样的问题,无非就是一个指针的指针,而后一


指针表象上就是那个数组,所以如果我们要想访问数组元素,就必须通过多加


一个指针的方式来访问,而且还需要注意的是,后一指针也就是表象上的数组


的寻址或者是跳跃方式是按照每一个元素以sizeof(int)的空间来跳跃的,我


们也可以让这样的int成为其他的基本类型或者是扩展类型,只不过改变的跳


跃的空间的大小或者是方式(这里的方式可以认为是某种具有嵌套关系的扩