指针数组与数组指针比较
来源:互联网 发布:mac家装设计软件 编辑:程序博客网 时间:2024/04/27 22:23
指针是C语言里面很重要的一个东西,C语言因为有了指针才变得绚丽多彩。有句话是这样说的“如果你掌握了指针与内存,那么C语言也就学会了。”,由此可见,指针的重要性。这里我简要谈谈指针数组与数组指针的区别。
从他们的名字我们可以得出这样的结论:
指针数组:这是一个数组;
数组指针:是一个指针。
然后我们看看他的用法:
(我们在分析是数组还是指针的时候可以采用把他名字和类型分开来分析,去掉他的名字以后剩下的就是类型,化复杂为简单,由内到外一步一步的去分析,切莫操之过急)
例如:
int *arr[ ]: 由于[ ]的优先级高于*,所以他是一个数组。去掉他的名字,我们看到他的类型是一个int*,所以他表 示数组中的内容是int*型的指针,整体就代表他是就是一个指针数组。
int (*arr)[ ]:由于( )的优先级高,所以arr与*先结合,所以确定它是一个指针,去掉它我们看到留下了int [ ]。所 以整体就是数组指针。
接下来我们看一个简单程序
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int main(){int arr[] = {1, 2, 3, 4, 5};int *a[5] = {0}; //指针数组int (*p)[5] = NULL; //数组指针int i = 0;p = &arr;//将数组c中元素赋给数组afor(i=0;i<4;i++){a[i]=&arr[i];}printf("%d\n%d\n", *a[0], (*p)[0]);return 0;}
接下来看看结果
结果一样
那么我们是不是可以得出一个结论:指针数组和数组指针是一样的?
接下来我们进一步看看这个数组指针
数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
例:int (*p)[10]; p即为指向数组的指针,又称数组指针。
易混淆概念
数组指针是指向数组首元素的地址的指针,其本质为指针;
指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
数组指针的使用在某些情况下与指针数组很相似,要注意区别。
二维概念
为了能更好地理解数组指针,与普通指针及二级指针的区别,下面举例说明一下。
char c[][3] = {"abc", "cds", "dss", "asz", "as", "vdd"};char (*p)[3];int i;p = c;for(i=0; i<6; i++){printf("%s, ", *(p+i)); //*p++;}printf("\n"); //p=c;/p--;for(i=5; i>=0; i--){printf("%s\n", *(p+i)); //*p--;/*--p;}指针数组:int i;char *pch[6] = {"abc", "cds", "dss", "asz", "as", "vdd"}; //这种写法不提倡,应该先声明一个数组,再把地址给指针,for(i=0;i<6;i++) //否则很危险;{printf("%s, ",*(pch+i));}printf("\n");for(i=5; i>=0; i--){printf("%s\n",*(pch+i)); }
例如:{int a[4][5];int (*p)[5]=a;}这里a是个二维数组的数组名,相当于一个二级指针常量;
p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;
*p+i是二维数组a[0][ i ] 的地址;
*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。
//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译
(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。
与指针数组的对比
数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指
针,这个指针不可移动); 指针数组是数组元素为指针的数组,其本质为数组。
例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针 []的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
注意:指针说起来很简单,但是真正用起来很容易出错,把指针用对了,可以达到事半功倍的效果,但是出错了的后果也很严重,所以在使用它的时候需要谨慎又谨慎,细心再细心。
- 数组指针与指针数组的比较
- 指针数组与数组指针比较
- 指针与数组的比较
- 指针与数组的比较
- 指针数组与二级指针比较
- C++指针数组与数组指针的比较
- C++指针数组与数组指针的比较(二)
- 指针:指针与数组
- 指针与指针数组
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 数组指针与指针数组
- 指针数组与数组指针
- 前端
- spark-submit提交参数设置
- Hbase Filter Scala 实战
- ZJU 3170 7 Levels of Binary Search Tree
- 新一代 Linux 文件系统 btrfs 简介
- 指针数组与数组指针比较
- HTTP协议 (二) URL
- 系统整理javascript---1
- 九度 题目1337:寻找最长合法括号序列
- JavaScript-打开新窗口(window.open)
- word域代码 乱序
- malloc/free与new/delete的区别
- 方便Lucene高版本使用IKAnalyzer分词
- iOS学习