数组指针(二级指针的第二种内存模型)
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语言提高25】二级指针做输入的第二种内存模型:二维数组
- 二级指针做输入_第二种内存模型
- 二级指针的内存模型
- C语言 二级指针内存模型混合实战
- C提高_day03_二级指针做输入第2种内存模型
- 【C语言提高24】二级指针做输入的第一种内存模型:数组指针
- 二级指针的三种内存模型
- 第三天2017/03/30(下午:二级指针的(输出)内存模型)
- 指针数组(二级指针的第一种内存模型)
- 二级指针第三种内存模型
- C提高_day03_二级指针做输入第3种内存模型
- C语言 二级指针内存模型混合实战
- 二级指针的三种内存模型
- C二级指针内存模型一
- 二级指针的第三种内存模型
- 第三天2017/03/30(上午:二级指针的(输入)内存模型:(共三种模型))
- 二级指针的三种内存模型
- 二级指针作输入之内存模型一
- C二级指针内存模型二