您的位置:首页 > 编程语言 > C语言/C++

数组指针(二级指针的第二种内存模型)

2014-08-05 22:00 239 查看
本节主要讲述数组指针,期间会提及二维数组,为后续学习做铺垫。

定义数组指针的方法有三种

1)  通过数组类型定义数组指针:ArrayType* pointer;

int a[5];
typedef int(MYINT)[5];  //定义了一个数组类型
MYINT  *iArrayP = NULL;
iArrayP = &a;


2)  声明一个数组指针类型:

typedef int (*Mypointer)[5];
Mypointer mypoint = &a;


3)  直接定义:

int  (*pointer)[5];


 

内存模型其实就是前面一个例子中的图,如下所示。



 

看下面一个例子

int main()
{
int i = 0;
int c[5];
int (*pointer)[5] = &c;  //这是属于初始化,当然也可以先定义,然后再赋值:pointer = &c;
for (i=0; i<5; i++)
{
(*pointer)[i] = i;
}
for (i=0; i<5; i++)
{
printf("%d %d\n", c[i], (*pointer)[i]);
}
getchar();
return 0;
}
输出结果:输出很显然,这里就不贴图了。

 

数组做函数参数会退化为指针

先看下面一个例子

int printfArray11(int ary[], int count)
{
int i = 0;
for (i=0; i<count; i++)
{
printf("%d", ary[i]);
}
return 0;
}

int printfArray12(int ary[1], int count)  //其实这里得形参ary[10]跟ary[]没啥区别,赋给形参ary的只是一个地址而已。
{
int i = 0;
//printf("%d\n",sizeof(ary));   //无论定义的形参ary[]是多大,这里输出的都是
for (i=0; i<count; i++)
{
printf("%d", ary[i]);
}
return 0;
}

int printfArray13(int *ary, int count)
{
int i = 0;
for (i=0; i<count; i++)
{
printf("%d", ary[i]);
}
return 0;
}
//printfArray11、printfArray12、printfArray13功能相同

int printfArray21(int b[2][3], int count)
{
int i,j;
//printf("b[2][3]:%d\n",sizeof(b));    //这里同样输出
for (i=0; i<2; i++)
{
for(j=0; j<3; j++)
printf("%d", b[i][j]);
}
return 0;
}

int printfArray22(int b[][3], int count)
{
int i,j;
for (i=0; i<2; i++)
{
for(j=0; j<3; j++)
printf("%d", b[i][j]);
}
return 0;
}

int printfArray23(int (*b)[3], int count)
{
int i,j;
for (i=0; i<2; i++)
{
for(j=0; j<3; j++)
printf("%d", b[i][j]);
}
return 0;
}
//printfArray21、printfArray22、printfArray23功能相同

int main()
{
int b[2][3] = {{1,2,3},{4,5,6}};
int *p = (int *)b;

printfArray11(p, 6);
printfArray21(b, 6);

//为了研究指针p的指向问题,以及二维数组b的一些情况,这里做如下分析。
printf("\n");
printf("  p     :%d\n",p);
printf(" *p     :%d\n",*p);

printf("\n");
printf(" &b     :%d\n",&b);
printf("  b     :%d\n",b);
printf("  b+1   :%d\n",b+1);

printf("\n");
printf(" *b     :%d\n",*b);
printf(" *b+1   :%d\n",*b+1);
printf(" *b+2   :%d\n",*b+2);

printf("\n");
printf("*(b+1)  :%d\n",*(b+1));
printf("*(b+1)+1:%d\n",*(b+1)+1);
printf("*(b+1)+2:%d\n",*(b+1)+2);

getchar();
return 0;
}
输出结果如下:



分析
(me)二维数组b的内存模型如下:



另外对于int printfArray12(int ary[1],int count)函数中的形参ary,sizeof运算始终是4。但是如果不是形参,而是普通的局部数组变量,情况则不一样了。如下例。

int main()
{
int a[10];
int b[2][3];
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(b));
getchar();
return 0;
}
输出结果分别为:40、24

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C C++