C语言指针与二维数组
来源:互联网 发布:熟练掌握编程 英文 编辑:程序博客网 时间:2024/04/30 10:09
#include<stdio.h>int main(){ int array[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; int (*p)[3] = NULL; p = array; // p is same as array,the use of p is same as array. //so p is the two-devision pointer same as array int *p1 = &array[0][0]; //p1 is the one-devision pointer int *p2 = array[0]; //int **p3 = array; this is wrong. the array's kind is int(*)[3] //but p3 is int** printf("%d ",*array[0]);//out:1 //(*p)[n] think array is the one-devsion array //so (*p) is the header pointer of the one-devision array //so (*p)[1],(*p)[2]......(*p)[i] is right printf("%d ",(*p)[0]);//out:1 printf("%d ",(*p)[1]);//out:2 printf("%d ",(*p)[2]);//out:3 printf("(*p)[3]:%d ",(*p)[3]);//out:4 printf("(*p)[4]:%d ",(*p)[4]);//out:5 printf("(*p)[5]:%d ",(*p)[5]);//out:6 //think p is same totaly as array //*p pointing the zero row //*(p+1) pointing the one row //*(p+2) pointing the two row //*(p+3) pointing the three row //and array is four rows, so *(p+4) is overflow printf("%d ",(*(p+1))[0]); //out:4 printf("%d ",(*(p+2))[0]); //out:7 printf("%d ",*(p+3)[0]); //out:10 printf("%d ",*(p+3)[1]); //overflow printf("%d ",(*(p+3))[1]); //11 printf("%d ",(*(array+3))[1]);//11 printf("%d ",*(array+3)[1]);//overflow printf("*(array+3)[0]: %d ",*(array+3)[0]); //10 printf("*(array+3)[1]: %d \n ",*(array+3)[1]); //overflow printf("%d \n",*(*(p+3)+1)); //out:11 printf("*(array[3*3+1]):%d \n",*(array[3*3+1])); //overflow printf("*array[3*3+1]:%d \n",*array[3*3+1]); //overflow //printf("*array[3*3+1]:%d ",**array[3*3+1]); // is wrong **array[3*3+1] printf("%d \n",*p[3*3+1]); //overflow printf("*(array[3]+1):%d \n",*(array[3]+1)); //11 printf("%d \n ",*(p+4)[0]); //overflow /*all below is wrong. p1 is the pointer pointing array[0][0] * pi++ pointing array[0][1] and so on .the adder is sizeof(int) * printf("%d ",(*p1)[0]);//out:1 printf("%d ",(*p1)[1]);//out:2 printf("%d ",(*p1)[2]);//out:3 printf("(*p1)[3]:%d ",(*p1)[3]);//out:4 printf("(*p1)[4]:%d ",(*p1)[4]);//out:5 printf("(*p1)[5]:%d ",(*p1)[5]);//out:6 printf("%d ",*(p1+1)[0]); //out:4 printf("%d ",*(p1+2)[0]); //out:7 printf("%d ",*(p1+3)[0]); //out:10 */ int i = 0; for(i;i<12;i++){ printf("%d ",*(p1+i)); } printf("\n"); // for p2=array[0] printf("%d ",*p2);//1 printf("%d ",*p2+10); //11 printf("%d ",*(p2+1));//2 printf("%d ",*(p2+2));//3 printf("%d ",*(p2+3));//4 printf("%d ",*(p2+4));//5 printf("%d ",*(p2+5));//6 printf("%d ",*(p2+6));//7 printf("%d ", *p2++); //1 printf("%d ",*p2); }
对于二维数组用指针只能是上述p和p1和p2的用法,p3的赋值方法是错误的。
访问二维数组array[i][j]的方法有3种:*(array[i]+j) array[i][j] *(*(array+i)+j)
当int (*p)[3]=array时,p和array是一样的,都是行指针,则在行指针进行加法运算时,是行间的移动,例如array+i 和p+i,是跨行的移动
int *p1=&array[0][0] 此时p1是一维指针,则现在将二维数组看作一个一维数组,然后p1的移位操作来进行逐个元素进行访问。
p2同p1
还要注意的是:int *a[3] 说明的先后顺序是:p-->[3]-->*-->int 先说明数组,再说明指针;这是一个指针数组(指针数组,数组存储的是指针,将在下一篇文章中讲解)
所以上面代码中,如下:
printf("%d ",*(p+3)[1]); //overflowprintf("%d ",(*(p+3))[1]); //11printf("%d ",(*(array+3))[1]);//11printf("%d ",*(array+3)[1]);//overflow要用(*(array+3))[1])这样的形式,用括号将*运算括起来先进行运算,(*(array+3)):表示{10,11,12}这个数组的首地址,再用[]操作来根据脚标进行取值。
printf("*array[3*3+1]:%d \n",*array[3*3+1]); //overflow
这样的访问是错误的,因为array是行指针,所以array[3*3+1]已经越界了
0 0
- c语言二维数组与指针
- c语言二维数组与指针
- C语言指针与二维数组
- C语言中的二维数组与指针
- C语言指针与二维数组
- c语言二维数组与指针
- C语言二维数组与指针
- C语言--二维数组与指针浅谈
- C语言指针与二维数组
- C语言指针与二维数组
- C语言指针与二维数组
- C语言二维数组与指针
- 104 C语言指针与二维数组
- c语言二维数组与指针
- C语言二维数组与指针数组以及行指针
- C语言二维数组指针
- C语言指针与二维数组(二维数组与一维数组关系)
- c语言二维数组的下标运算与指针偏移
- Extjs4X的Itemselector插件使用
- ios-事件响应者链
- Erlang-实现进程环
- container_of宏定义解析
- 返回json的型式的用法
- C语言指针与二维数组
- C# Why does '+' + a short convert to 44
- Android判断上网方式(Wifi还是数据流量)
- 学习笔记:OC的protocol协议及代理设计模式
- Android 发送短信
- nasm汇编一些需要注意的地方
- java swing几种常用容器简单实现
- vc6 控件 message map
- iPhone应用开发中使用宏定义判断是虚拟机还是设备