[转载]指针数组和数组指针 以及 const指针_马鸿凯_新浪博客

指针数组和数组的区别:

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

 。指针

数组

中的每一个元素均为指针)可以这样理解:每个元素都是指针的一个n维

数组

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

是指向数组首元素的地址的指针

。可以这样理解:指向数组n个一维数组的n个指针

一、指针数组:

      类型名

 *数组标识符[数组长度]”

       如:int *a[n].. ={....}(每个里面有列)

 假设为二维:   

     访问:第i行,第j列*(a[i]+j)等价于a[i][j]

     访问:第i行所有元素a[i][0]....a[j][m-1]  或 *(a[i]+0).....*(a[i]+m-1)

解析:貌似很有道理:

二维数组

   二维数组

:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改

    指针

数组:如char *str_B[5] 系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是

一个指向字符型数据

的一个指针

char a[3][8]={"gain","much","strong"};

char *n[3]={"gain","much","strong"};

   系统给数组

a分配了

3×8的空间,而给n分配的空间则取决于具体字符串的长度。此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。

   由此可见,相比于比二维字符数组,指针

数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做

例如:

{

int a[4][5];

int (*p)[5]=a;

}

a是个二维数组名,

相当于一个二级指针常量

p是一个指针变量,它指向

有5个int元素的一维数组,

此时p的增量

以它所指向的一维数组长度为单位;

*(p+i)是二维数组a[i][0]的地址

*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。

//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译

(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果

#include

#include

void main()

{

    int i;

    char *pch[6] = {"fuck","you","sb","nb","db","mb"};

    for(i=0;i<6;i++)printf("%s, ",pch[i]);

    printf("n");

     for(i=5; i>=0; i--)       printf("%sn",pch[i]);

}

二、数组指针:

   数据类型 (*数组名)[][].. = {....}

如:int (*a)[n][m].. ={....}

  int  *p[m];  // m确定访问的每行元素

假设为二维:   

     访问:第i行,第j列  p[i][j] 或*(*(p+i)+j) 或 *(p[i]+j)

解析:

     二维数组

:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。

例如:

int a[4][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

int (*p)[5]=a;

int i,j;

for (i = 0 ; i < 4; i++)

for (j = 0 ; j < 5; j++)

{

printf("%d ",p[i][j]);   //或*(*(p+i)+j) 或 *(p[i]+j)

}

printf("n");

}注:数组名其实就是一个不能被赋值的指针,即指针常量

 

        对于给指针赋值时一般只能赋给相同类型的指针,但是void指针可以存储各种类型地址,任何的值可以赋给void类型指针的变量.

  例如:void *pv;

       Int i = 10;

       pv = &i;

       Int *j=static_castpv;

而带const的指针看

const的修饰

  如 int *  const a = 10;  指针类型的常量,指针本身的值不能改变a = &i;(错误)

  再如:  const  int * a = 10;  int *指向的值不能改变 *a = &i(错误) a = &j;(正确)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma_Hong_Kai

微信 2936729162

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值