服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++数组和指针的区别与联系

C++数组和指针的区别与联系

2022-08-10 11:05龙小 C/C++

这篇文章主要介绍了C++数组和指针的区别与联系,数组是具有固定大小和连续内存空间的相同数据集合,指针是指存放内存地址的变量,更多详细资料请参考下面文章内容

前言:

一直以来,有很多地方在说到数组和指针时都会说数据就是指针,这种观点也被越来越多的人接受。本文将主要介绍数组和指针。是不是一样的大家自己理解。如此而已……

1 数组和指针的概念

数组:具有固定大小和连续内存空间的相同数据集合。里面的存储的元素具有地址连续性和数据类型相同的特点。
指针:是指存放内存地址的变量。从0开始。32位系统可访问内存4G,目前64位系统可寻址内存空间为128G。(可能会更大。这个需要硬件资源的支撑。不抬杠)

2 数组和指针的操作

2.1 赋值

数组:对数组元素进行逐个赋值。
指针:相同类型指针可以直接进行赋值。

2.2 存储

数组:从数组的定义就可以知道。数组的内存是连续的。可以在栈上进行定义也可以通过malloc或者new等在堆上进行定义。
指针:本身是一个变量,指向其对应的类型的变量。指向的地址也是变量的地址,然后在通过该地址获取它指向变量的值。

2.3 大小

可以通过sizeof宏进行获得。

数组:数组的大小通过sizeof(数组名)/sizeof(类型名)获取。
指针:在32位的操作系统中为4,在64位操作系统中是8。

2.4 初始化

数组的初始化方式为:

?
1
2
3
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} };

指针的初始化方式为:

?
1
2
3
4
5
6
7
8
//定义一个指向整型变量的指针
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 数组的传参

数组传参分为一维数组和多维数组。当做参数传入时会退化成指针。

一维数组:

?
1
2
3
4
5
6
7
8
9
10
void Fun(int a[])
{
    ;
}
int main()
{
   int testArray[]={1,2,3};
   Fun(testArray);
   return 0;
}

如上,当然也可以将Fun函数的参数形式定义为如下形式:

?
1
2
3
4
void Fun(int *a)
{
    ;
}

二维数组:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 指针的传参

如果函数的参数是一个指针。那么可以给函数传递的参数为三种,分别是:指针变量、变量的地址、一个数组名。在这里数组名实际上就是指向数组的首地址。
指针:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
}

指针的指针:
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 总结

除了上面介绍外,指针还有函数指针,自然就会有指向函数的指针数组以及指向函数指针的指针。在实际使用时,这些类型的引入在指引我们灵活编程的同时也给我们带来了很大的风险,一旦出错,排除问题和解决问题的复杂度也将增加。在进行指针编程的时候需要谨慎使用。
函数和数组既有相同点,也有不各自独特之处。细思之,一些所谓函数既指针的说法需要谨慎判断。切勿人云亦云!

到此这篇关于C++数组和指针的区别与联系的文章就介绍到这了,更多相关C++数组和指针的区别内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

延伸 · 阅读

精彩推荐
  • C/C++C++14新特性的所有知识点全在这

    C++14新特性的所有知识点全在这

    这篇文章主要介绍了C++14新特性的所有知识点全在这,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    王志强4942021-09-18
  • C/C++C语言中等待socket连接和对socket定位的方法

    C语言中等待socket连接和对socket定位的方法

    这篇文章主要介绍了C语言中等待socket连接和对socket定位的方法,分别为listen()函数和bind()函数的用法,需要的朋友可以参考下...

    C语言教程网11322021-03-11
  • C/C++C++实现二叉树遍历序列的求解方法

    C++实现二叉树遍历序列的求解方法

    这篇文章主要介绍了C++实现二叉树遍历序列的求解方法,需要的朋友可以参考下...

    C++教程网8972021-01-27
  • C/C++C++实现红黑树应用实例代码

    C++实现红黑树应用实例代码

    红黑树它一种特殊的二叉查找树,这意味着它满足二叉查找树的特征,但是也有许多自己的特性,这篇文章主要给大家介绍了关于C++实现红黑树的相关资料,需要...

    去伪存真11962022-02-17
  • C/C++解析VScode在Windows环境下c_cpp_properties.json文件配置问题(推荐)

    解析VScode在Windows环境下c_cpp_properties.json文件配置问题(推荐)

    这篇文章主要介绍了解析VScode在Windows环境下c_cpp_properties.json文件配置问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需...

    仰望星空~~11702021-09-06
  • C/C++QT编写窗口插件实现调用窗口的自适应

    QT编写窗口插件实现调用窗口的自适应

    这篇文章主要为大家详细介绍了QT编写窗口插件实现调用窗口的自适应,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考...

    zebra_zzh12262021-11-17
  • C/C++Opencv分水岭算法学习

    Opencv分水岭算法学习

    这篇文章主要为大家详细介绍了Opencv分水岭算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    丶Minskyli7362021-06-19
  • C/C++C++构造函数一些常见的坑

    C++构造函数一些常见的坑

    这篇文章主要给大家分享的是C++构造函数一些常见的坑,文章围绕C++构造函数的相关资料展开关于C++构造函数坑的内容,具有一定的参考价值,需要的小伙...

    梁唐11442022-08-07