[Pointer]C中指针与多维数组学习
2015-07-11 00:18
260 查看
问题描述:C中指针的用法非常灵活,合理使用指针可以避免副本拷贝等。多维数组与指针的结合使用有时可以带来许多方便。
指针处理多维数组的行:这个处理相对简单,以二维数组为例,
int a[ROW][COL]={};
int *p;
要用p指向a的某一行,使用p=a[i]即可。
指针处理多维数组的列:比行处理稍复杂,因为数组是按行存储而非列。以二维数组为例,
#include <stdio.h>
int main(void) {
int a[3][4]={0};
int i,j;
int (*p)[4];
for(p=a;p<=&a[2];p++)
(*p)[2]=8;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
printf("%d, ",a[i][j]);
return 0;
}
运行结果:
这里用到了数组指针,int(*p)[4];为一个指向长度为4的一维数组的指针,二维数组a[3][4]的每一行都是长度为4的一维数组,因此可以将数组指针指向每一行的地址,然后用(*p)[2]=8;为指向的一维数组的第三个元素赋值8,这样即实现了对二维数组的列的操作了。
多维数组名与指针:以二维数组为例,如a[ROW]{COL},数组名a此时是指向指针的指针,多维数组的理解可以参照一维数组,此时可将a看成是一个一维数组,但是每个元素也是一个一维数组,因此a就是指向其第一个一维数组元素的指针,即(*)[COL],此时(*a)[0]就是a[0]了:
#include<stdio.h>
int main(void)
{
inti,j;
inta[3][4]={0};
int(*p)[4];
//二维数组初始化
for(p=a;p<=a+2;p++)
for(i=0;i<4;i++)
(*p)[i]=i;
//二维数组打印
for(p=a;p<=a+2;p++)
for(i=0;i<4;i++)
printf("%d, ",(*p)[i]);
//打印**a
printf("\n **a %d\n",**a);
//利用数组名作为指针打印数组元素
for(i=0;i<3;i++)
for(j=0;j<4;j++)
printf("%d, ",*(*(a+i)+j));
}
运行结果:
指针处理多维数组的行:这个处理相对简单,以二维数组为例,
int a[ROW][COL]={};
int *p;
要用p指向a的某一行,使用p=a[i]即可。
指针处理多维数组的列:比行处理稍复杂,因为数组是按行存储而非列。以二维数组为例,
#include <stdio.h>
int main(void) {
int a[3][4]={0};
int i,j;
int (*p)[4];
for(p=a;p<=&a[2];p++)
(*p)[2]=8;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
printf("%d, ",a[i][j]);
return 0;
}
运行结果:
0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0,
这里用到了数组指针,int(*p)[4];为一个指向长度为4的一维数组的指针,二维数组a[3][4]的每一行都是长度为4的一维数组,因此可以将数组指针指向每一行的地址,然后用(*p)[2]=8;为指向的一维数组的第三个元素赋值8,这样即实现了对二维数组的列的操作了。
多维数组名与指针:以二维数组为例,如a[ROW]{COL},数组名a此时是指向指针的指针,多维数组的理解可以参照一维数组,此时可将a看成是一个一维数组,但是每个元素也是一个一维数组,因此a就是指向其第一个一维数组元素的指针,即(*)[COL],此时(*a)[0]就是a[0]了:
#include<stdio.h>
int main(void)
{
inti,j;
inta[3][4]={0};
int(*p)[4];
//二维数组初始化
for(p=a;p<=a+2;p++)
for(i=0;i<4;i++)
(*p)[i]=i;
//二维数组打印
for(p=a;p<=a+2;p++)
for(i=0;i<4;i++)
printf("%d, ",(*p)[i]);
//打印**a
printf("\n **a %d\n",**a);
//利用数组名作为指针打印数组元素
for(i=0;i<3;i++)
for(j=0;j<4;j++)
printf("%d, ",*(*(a+i)+j));
}
运行结果:
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,
**a 0
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,
相关文章推荐
- [Comparation]Cadence,PADs,Altium Designer简要对比整理
- [Overview]DSP硬件的初步了解
- [FileIO]C语言中流与文件操作编程学习
- [Union]C语言编程中联合Union的学习
- Mybatis-There is no getter for property named 'tj' in 'class
- java数组初始化
- windows环境下使用VS2012编译SQLITE3
- 新的公司
- Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇
- [C8051F320]串口UART0全双工调试过…
- [struct]C编程数组与结构的学习
- [SwitchCase]C语言编程switch case的使用
- [struct]C语言编程结构体的学习
- [MSComm]实现串口通信编程学习
- [MSComm]MSComm控件注册以便在LabVIEW中使用
- [MSComm]串口通信有关的MSComm控件
- [ARM7--LPC23xx]LPC23xx定时器学习
- [Dropbox]一款很实用的个人文件同步利器
- [Embedded_SW_规范化]学习一些C编程规约_保持更新
- [Embedded_SW_模块化]嵌入式C语言工程文件组织_保持更新