C语言数组指针指针数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dsanmux/article/details/47860971

在数组指针和指针数组这块我总是弄不清楚,总结一下

指针数组:用于存储指针的数组,也就是数组元素都是指针

数组指针:指向数组的指针

关于这部分有一道题:

       一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型

      这道题一开始我总是弄不清楚
 
       正确答案:int  (*a[10]) (int);
      C的类型系统的派生方法是嵌套,通过类型嵌套进行无限派生。如果声明:int ( *p )( int );
       你可以很容易看明白p是一个函数指针,然后,用a[10]代替那个p,这就是个嵌套的过程,
       即int  (*a[10]) (int)。

区别:

类型名称   *数组名称[数组长度];

int* a[4]     指针数组     

                    表示:数组a中的元素都为int型指针    

                    元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针     

                      表示:指向数组a的指针

                      元素表示:(*a)[i]  

#include <stdio.h>
void main(void)
{
     int c[4]={1,2,3,4};
     int *a[4];          //指针数组
     int (*b)[4];        //数组指针
     b=&c;
     //将数组c中元素赋给数组a
     for(int i=0;i<4;i++)
     {
          a[i]=&c[i];
     }  
     printf("%d\n",*a[1]);       //输出2就对   <pre name="code" class="plain">     printf("%d\n",<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">(*b)[2] </span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">);  </span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">}  </span>

 
 

注意:

定义了数组指针,必须给指针指定一个数组的首地址

容易犯的错得就是,不给 b 地址,直接用 (*b)[i]=c[i] 给数组 b 中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,运行时会出现问题,使用指针时要注意这个问题。

a就不用给他地址,a的元素是指针,for循环内已经给数组a中元素指定地址了。若for循环内写*a[i]=c[i],也会出问题


了解数组指针,与普通指针及二级指针的区别

{int a[4][5];int (*p)[5]=a;}

这里a是个二维数组的数组名,相当于一个二级指针常量;

p是一个指针变量,它指向包含5int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;

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

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

(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。

(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。

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

数组指针:

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

p=a;

for(int i=0;i<3;i++)
{

       for(int j=0;j<4;j++)
  {
             printf("%d",p[i][j]);                //或者 **p+i+j) 或者 *p[i]+j
  }
  printf("\n");
}

指针数组:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p[3];
for(int ix=0;ix<3;ix++)

{
  p[ix]=a[ix];

}

for(int i=0;i<3;i++)
{

       for(int j=0;j<4;j++)
  {
           printf("%d",p[i][j]);              //或者    **p+i+j)   或者   *p[i]+j
  }
  printf("\n");
}






猜你喜欢

转载自blog.csdn.net/dsanmux/article/details/47860971