对于数组和指针的理解
来源:互联网 发布:pc读取s7 200plc数据 编辑:程序博客网 时间:2024/06/05 06:22
首先介绍一下数组,实际程序过程中接触到较多的应该就是一维数组和二维数组了,那么这两个数组如何去理解运用呢?
一、一维数组
1、一维数组的表示
int a[3]={1,2,3};int a[]={1,2,3};//两种定义均可
2、一维数组名的含义
如上定义的数组名a表示的是a数组中的首地址
#include<stdio.h>void main(){int a[3]={1,2,3};int *p;p=a; //由于数组名称即代表首元素地址,因此无需加取地址符&printf("%p\n",p); //输出p指向的数组a的首元素地址}
二、二维数组
1、二维数组的表示
int a[2][2]={1,2,3,4};//还有其他方法也可表示2、二维数组名的含义
由于二维数组存储在内存空间中为连续存储,即按照数组a[0][0]到a[1][1]是连续的。
假设二维数组定义为a[m][n],则该数组有m个行数组,由以上推导,数组名表示数组首元素的地址,那么二维数组名表示什么呢?
其实,二维数组名a代表是二维数组中首个行数组,a+1代表的是下一个行地址,以此类推
行数组其实就是一维数组,a[0]代表的是第一行的行数组,a[1]代表的是第二行的首地址,都是一维数组,以此类推。那么既然a[0]代表的是一维数组,数组名即是数组的首元素的地址,所以a[0]代表的是第一行中首元素的地址。
#include<stdio.h>void main(){int a[3][2]={1,2,3,4,5,6};int *p;p=a[0]; //a[0]即代表数组首行数组中首元素的地址printf("%p\n",p); //输出指针指向的地址值}
#include<stdio.h>void main(){int a[3][2]={1,2,3,4,5,6};int (*p)[2]; //该段定义了一个数组指针,即二维数组中常用的行指针p=a; //a即为首行数组的地址值printf("%p\n",p); //两端程序输出结果相同}
三、与数组有关的指针
1、一维数组的指针定义与调用
#include<stdio.h>void main(){ int a[]={1,2,3}; int *p,i=0; p=a; for(i=0;i<3;i++) printf("the num is:%d\n",p[i]);//或者改成*(p+i)也可输出同样效果}2、二维数组的指针定义与使用
#include<stdio.h>void main(){ int a[3][2]={1,2,3,4,5,6}; //定义二维指针时一定要有列数 int *p,i=0,j=0; p=&a[0][0]; //p=a[0]效果相同 for(i=0;i<3;i++,p++)// for(j=0;j<2;j++) printf("the num is:%d\n",*p);}
3、关于行指针的使用
C语言中常用行指针进行传参,在了解行指针之前,我们先了解一下什么是数组指针指针数组
首先用英文会理解得更加直观
1、数组指针(a pointer to an array)
int a[2][3]={1,2,3,4,5,6};int (*p)[3]; //[]运算符优先于*运算符,因此需要加括号,代表p是一个指针,指向一个有三个元素的数组,也就是常用的行指针p=a; //即p指向a数组的第一行
2、指针数组(a array of pointer)
#include<stdio.h>void main(){ int a[3][2]={1,2,3,4,5,6}; //定义二维指针时一定要有列数 int i=0,j=0; int *p[3]; //定义了一个指针数组 p[0]=a[0]; p[1]=a[1]; p[2]=a[2]; for(i=0;i<3;i++) printf("the num is:%d\n",*p[i]);}
3、重点理解部分
二维数组中a[m][n]中,a代表了第一个行数组的首地址,由于a并未降级为一维数组,所以*a仍表示为第一个行数组的首地址,a+i代表偏移i行;
a[0],a[1]等已经降级为一维的行数组,所以a[0]代表的是0行第一个元素的地址,*(a[0])表示的是a[0][0]的值,定义一个指针p,*(p[0]+1)或者是*(*(p+i)+j)代表的是a[i][j]出元素的值。
阅读全文
0 0
- 对于数组和指针的理解
- 对于数组和指针的理解
- 对于数组与指针的理解
- 对于数组指针—指针数组;函数指针—函数指针数组,指向函数指针数组的指针,的理解
- 嵌入式 对于指针和数组的问题
- 数组指针和指针数组的理解
- 个人对于数组和缓冲区的理解
- 数组和指针的理解
- 指针和数组的理解
- 对于数组的理解
- 对于数组和指针运算
- 对于结构体指针+、-常数的理解(page_to_pfn和pfn_to_page)
- 对于结构体指针+、-常数的理解(page_to_pfn和pfn_to_page)
- 对于C++中引用和指针的理解
- 理解数组指针和指针数组的区别
- C语言:数组指针和数组指针的理解
- 对于树状数组的理解
- 数组和指针的一些理解
- 5、Oracle的排序
- UE4 补丁更新(基于Http)
- day04笔记
- 对迭代器,生成器,yield的备忘
- 草稿
- 对于数组和指针的理解
- mysql配置文件my.cnf详解
- [bzoj3037][贪心]创世纪
- Oracle:连接合并列的输出
- mysql 主从复制
- jQuery基础系列(二):jQuery属性操作方法
- Android studio中todo的用法
- UVA
- 项目浪费时间统计表