对于数组和指针的理解
2017-11-04 09:30
211 查看
首先介绍一下数组,实际程序过程中接触到较多的应该就是一维数组和二维数组了,那么这两个数组如何去理解运用呢?
由于二维数组存储在内存空间中为连续存储,即按照数组a[0][0]到a[1][1]是连续的。
假设二维数组定义为a[m]
,则该数组有m个行数组,由以上推导,数组名表示数组首元素的地址,那么二维数组名表示什么呢?
其实,二维数组名a代表是二维数组中首个行数组,a+1代表的是下一个行地址,以此类推
行数组其实就是一维数组,a[0]代表的是第一行的行数组,a[1]代表的是第二行的首地址,都是一维数组,以此类推。那么既然a[0]代表的是一维数组,数组名即是数组的首元素的地址,所以a[0]代表的是第一行中首元素的地址。
1、一维数组的指针定义与调用
3、关于行指针的使用
C语言中常用行指针进行传参,在了解行指针之前,我们先了解一下什么是数组指针指针数组
首先用英文会理解得更加直观
1、数组指针(a pointer to an array)
2、指针数组(a array of pointer)
3、重点理解部分
二维数组中a[m]
中,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]出元素的值。
一、一维数组
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]
,则该数组有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]
中,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]出元素的值。
相关文章推荐
- 对于数组与指针的理解
- 对于数组指针的一点理解
- 对于数组指针—指针数组;函数指针—函数指针数组,指向函数指针数组的指针,的理解
- 对于C语言中数组名是指针的理解
- 对于数组和指针的理解
- 【C语言】理解指针数组 数组指针 函数指针
- 深入理解C/C++数组和指针
- 对多维数组与指针的理解
- C的指针和数组的深入理解
- 深入理解C语言中的指针与数组之指针篇
- 如何理解数组作为函数参数时,数组名就是指针?
- 深入理解字符串、数组、指针---联系与应用
- 对C++中指向数组类型的指针的理解
- 指针数组、数组指针、函数指针的理解
- 如何理解字符串赋值给指针与数组的区别
- 个人理解:关于指针数组、数组指针、函数指针、函数指针数组、函数指针数组指针
- 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针的理解
- 【LVL1_6_c】 指针数组 数组指针 的区别(仅仅是初步学习理解)
- 深入理解指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针
- 如何理解数组作为函数参数时,数组名就是指针?