一直以来,有很多地方在说到数组和指针时都会说数据就是指针,这种观点也被越来越多的人接受。本文将主要介绍数组和指针。是不是一样的大家自己理解。如此而已……
1 数组和指针的概念
数组:具有固定大小和连续内存空间的相同数据集合。里面的存储的元素具有地址连续性和数据类型相同的特点。
指针:是指存放内存地址的变量。从0开始。32位系统可访问内存4G,目前64位系统可寻址内存空间为128G。(可能会更大。这个需要硬件资源的支撑。不抬杠)
2 数组和指针的操作
2.1 赋值
数组:对数组元素进行逐个赋值。
指针:相同类型指针可以直接进行赋值。
2.2 存储
数组:从数组的定义就可以知道。数组的内存是连续的。可以在栈上进行定义也可以通过malloc或者new等在堆上进行定义。
指针:本身是一个变量,指向其对应的类型的变量。指向的地址也是变量的地址,然后在通过该地址获取它指向变量的值。
2.3 大小
可以通过sizeof宏进行获得。
数组:数组的大小通过sizeof(数组名)/sizeof(类型名)获取。
指针:在32位的操作系统中为4,在64位操作系统中是8。
2.4 初始化
数组的初始化方式为:
//初始化一个双精度型数组
double balance[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
//初始化一个二维数组
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
指针的初始化方式为:
//定义一个指向整型变量的指针
int *p=new int(0) ;
//定义一个指向数组的指针
int *p=new int[n];
//定义一个指针的指针
int **pp=new (int*)[2];
pp[0]=new int[6];
pp[1]= new int[10];
指针数组和数组指针的定义请移步以下文章:[C语言简明知识系列十一(下):指针]
3 数组和指针的传参
C/C++的传参方式可以分为传值型和传址型,传值实际上对将参数进行拷贝,在程序运行中对参数做的任何修改都是在拷贝后的变量产生的,函数退出后不会影响传入参数,传址型恰恰相反,会对原有参数进行修改。数组和指针当做参数传入时基本为引用方式,具体要看代码作者是如何使用。
3.1 数组的传参
数组传参分为一维数组和多维数组。当做参数传入时会退化成指针。
一维数组:
void Fun(int a[])
{
;
}
int main()
{
int testArray[]={1,2,3};
Fun(testArray);
return 0;
}
如上,当然也可以将Fun函数的参数形式定义为如下形式:
void Fun(int *a)
{
;
}
二维数组:
void Fun(int (*a)[5])
{
;
}
int main()
{
int testArray[2][5]={
{1,2,3,4,5},
{4,5,6,7,8}
};
Fun(testArray);
return 0;
}
3.2 指针的传参
如果函数的参数是一个指针。那么可以给函数传递的参数为三种,分别是:指针变量、变量的地址、一个数组名。在这里数组名实际上就是指向数组的首地址。
指针:
void Fun_p(int *p){};
int main()
{
int testArray[]={1,2,3};
int *pIntArray = testArray;
int iValue = 10;
//传递数组名
Fun_p(testArray);
//传递指针变量
Fun_p(pIntArray);
//变量地址
Fun_p(&iValue);
return 0;
}
指针的指针:
void Fun(int **p)
{
;
}
int main()
{
int testArray[5]={1,2,3,4,5};
int *pIntArray = testArray;
int iValue = 10;
int *tmpP = &iValue;
//传递指针变量
Fun(&pIntArray);
//变量地址
Fun(&tmpP);
return 0;
}
4 总结
除了上面介绍外,指针还有函数指针,自然就会有指向函数的指针数组以及指向函数指针的指针。在实际使用时,这些类型的引入在指引我们灵活编程的同时也给我们带来了很大的风险,一旦出错,排除问题和解决问题的复杂度也将增加。在进行指针编程的时候需要谨慎使用。函数和数组既有相同点,也有不各自独特之处。细思之,一些所谓函数既指针的说法需要谨慎判断。切勿人云亦云!
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8