C/C++语言中的int a; int* a; int** a; int (*a)[]; int (*a)(int),重点介绍指针数组与数组指针 |
您所在的位置:网站首页 › A什么A › C/C++语言中的int a; int* a; int** a; int (*a)[]; int (*a)(int),重点介绍指针数组与数组指针 |
这一部分往往很少被总结,但是却经常用到,在使用的时候要注意区分。 先来一个基本的来入门吧! 参考自: https://blog.csdn.net/qq_36744540/article/details/79832728 数组指针首先,我们先介绍一下二维数组和二维数组的指针,二维数组相当于一个特殊的一维数组里面每个元素又是一个一维数组,例如:int a [ 3 ] [3],可以看成一个3行的一个列数组,每一列的元素又是一个长度为3的数组,数组名的一个特殊一维数组的首地址,如下: 对于指向二维数组的指针变量p,可以有两种: 一种是指向数组元素的列指针,一种是指向行的行指针,这时,p不是指向一个具体的数组元素,而是指向一个包含m个元素的一维数组。这里对行指针特殊说明一下; 行指针的定义形式为:类型标识符 (*指针变量名)[长度]; 例如: int a[3][4],(*p)[4]=a; //这里也可以写为int a[3][4],(*p)[4]=&a[0]; 其中p,p+1,p+2和a,a+1,a+2都是第i行的首地址。 使用指针变量访问二维数组的任意一个元素的方法 **(1)使用列指针:**定义一个列指针p,让它指向二维数组的第0个元素 int a[3][4]; int *p; p=&a[0][0]; //因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素,该二维数组的任意i行j列元素可表示为*(p+i*4+j)(2)使用行指针:定义一个行指针p,让它指向二维数组的第0行 int a[3][4]; int (*p)[4]; p=a; //也可以为p=&a[0];其中* ( *(p+i)+j)表示任意一个i行j列的元素。 多说一句,其实访问方式还可以很灵活的,跟直接使用数组名访问一样也可以,后面还会详细讨论。 参考自:https://www.cnblogs.com/zou107/p/4909847.html 一、关于二维数组和二维数组区别(1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的。所以从内存的角度来分析,一维数组和二维数组其实没有本质区别。 (2) 二维数组可以使用一维数组来代替。但是在实际的应用中,有时候使用二维数组会更加直观,方便程序的编程。 (3)两者在内存使用效率上是一模一样的。 二、二维数组的第一维和第二维概念(1)例如 int a[2][5]中,前面的2表示第一维;后面的5表示第二维 (2) 二维数组的第一维表示最外部的那一层,第一维本身也是一个数组,里面存放了2个元素,这两个元素就分别是第二维的数组。第二维数组本身也是一个数组,里面存放的元素是普通的int型变量。 例1: 1 int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; 2 int (*p)[5]; // 定义一个数组指针 3 p = a; 4 5 printf(" a[1][2] = %d.\n", a[1][2]); // a[1][2] = 8 6 printf("(*(p+1)+1) = %d.\n", *(*(p+1)+2)); // a[1][2]运行结果: 例2:理解 a 、&a、 a[0]、 &a[0]、 a[0][0]、 &a[0][0] /* 二维数组的几个符号的测试 1、a等同于&a[0] 2、a[0]等同于&a[0][0] 3、在数值上 a、&a、a[0]、&a[0]、&a[0][0] 是相等的,但是在类型上面是有区别的。 */ int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; printf("a = %p.\n", a); // a 类型是 int (*)[5] printf("&a = %p.\n", &a); // &a 类型是 int (*)[2][5] printf("a[0] = %p.\n", a[0]); // a[0] 类型是 int * printf("&a[0] = %p.\n", &a[0]); // &a[0] 类型是 int (*)[5] printf("a[0][0] = %d.\n", a[0][0]); // a[0][0] 类型是 int printf("&a[0][0] = %p.\n", &a[0][0]); // &a[0][0]类型是 int *运行结果: 运行结果: (1)需要理解二维数组的实质和几个符号的含义。 (2)二维数组和数组指针两者是有紧密的关系的。学会使用数组指针来操作二维数组,重在实践操作使用就会加深理解。 **注:学习笔记部分是在朱有鹏老师物联网视频教程中摘取,特此声明。**http://www.zhulaoshi.org/ a) int a;表示一个内存空间,这个空间用来存放一个整数(int); b) int* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间; c) int** a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间; d) int (a)[4];表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为4、类型为int的数组;和int* a的区别在于,++、+=1之后的结果不一样,其他用法基本相同。 以上四种类型见上图表示。 e) int (*a)(int);表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。 多说一句,都是指针,有时候可能值相同,但是意义却不同,使用方式或者说数据格式也不同。 重点: int *p[]和int (*p)[]前者是指针数组,后者是指向数组的指针。更详细地说。 前: 指针数组;是一个元素全为指针的数组. 后: 数组指针;可以直接理解是指针,只是这个指针类型不是int也不是char而是 int [4]类型的数组.(可以结合函数指针一并看看…) int*p[4]------p是一个指针数组,每一个指向一个int型的 int (*q)[4]---------q是一个指针,指向int[4]的数组。 定义涉及两个运算符:“”(间接引用)、“[]”(下标),“[]”的优先级别大于“”的优先级别。小括号或者说圆括号优先级最大。 首先看int *p[4],“[]”的优先级别高,所以它首先是个大小为4的数组,即p[4];剩下的“int *”作为补充说明,即说明该数组的每一个元素为指向一个整型类型的指针。int *p[4]的存储结构如下:(存储方格横向排列或竖向排列没区别,只要按内存地址顺序排列就行,此处只是为画图方便) 再看int (q)[4]。它首先是个指针,即q,剩下的“int [4]”作为补充说明,即说明指针q指向一个长度为4的数组。int (*q)[4]的存储结构如下: 请看以下定义: int a[2][4]={{2,5,6,8},{22,55,66,88}}; int c[4]={5,8,9,4}; int d[3]={23,12,443}; int *p[4],(*q)[4]; q=a; *p=c; *(p+1)=d;则int *p[4]和int (*q)[4]的存储数据为: |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |