本文主要是介绍好朋友?陌生人?-------指针与数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
数组:用来保存一组相同类型的元素的集合,通常用于固定数目且类型相同
指针:专门用来保存一个变量的地址,即指针就是地址,通常用于动态数据结构
数组的定义:
int arr[5]={1,2,3,4,5};
指针的定义:
int a=0;
int *p=&a;
数组:一但定义后,编译器会为它分配一段连续的存储单元,数目开始时就会直接或间接的被固定,看起来
虽然比较整洁,但写法比较死板,同样也比较浪费空间。
指针:指针存放的是一个地址值,指向某个单元,可以通过该指针来索引此单元,在编程和思路构建过程中
有很大的灵活性。
类似的,
指针数组:即数组元素全部为指针的数组,数组中的每个元素都是指针,本质为数组
数组指针:即指向数组首元素地址的指针,本质为指针
指针数组的定义:
int *arr[5];
数组指针的定义:
int (*p)[5];
二维数组和指针数组:
二维数组:如int arr[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且
该空间一定是连续的。其每个元素表示一个字符。我们可以通过制定下标对其元素进行修改。
指针数组如int *arr[5] 系统至少会分配5个连续的空间用来存储5个元素,表示arr是一个5个元素的
数组,每个元素是一个指向整型数据的一个指针。
如果我做这样的定义:
char a[3][8]={"gain","much","strong"};
char *n[3]{"gain","much","strong"};
他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了
3×8的空间,而给指针n分配的空间则取决于具体字符串的长度。
此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
由此可见,相比于比二维字符数组,数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制
在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二
维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
二维数组和数组指针:
例如:{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]的值。
指针和数组的联系:
char *p="abcdef";
*(p+2)----->c//通过指针形式访问c
p[2]-------->c//通过数组形式访问cint arr[10]={1,2,3,4,5,6};
*(arr+6)=7;//通过指针形式将第七个元素赋值为7
arr[6]=7;//通过指针形式
定义成数组,声明成指针------>错误
定义成指针,声明成数组------->可以用*(char**) 或(char*)*(int*)方式实现
可以用以下方式进行进一步说明:
int a=10;
int *arr[10];//指针数组----存放指针的数组
int (*ptr)[10];//数组指针----指向数组的指针
int *p=&a;//一级指针
int **q=&p;//二级指针
int (*ptr)[10]=&arr;//将指针数组首元素的地址赋值给数组指针
int *(*ptr)[10]=*arr;//将指针数组的值赋值给数组指针的解引用
个人能力有限,如有问题,请帮忙提出!
这篇关于好朋友?陌生人?-------指针与数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!