数组和指针的区别

  1. 数组内地址一定连续,指针则不一定连续。
  2. 数组赋值要么初始化就设定,要么循环元素赋值。而指针随时可以赋值(改变指向)。
  3. 数组的存储空间,不是在静态区就是在栈上。指针位置随意。
  4. sizeof(数组名)= 元素个数*sizeof(元素类型) 字节;而sizeof(指针) = 4字节(32位平台) 或 8字节(64位平台)
  5. 可以把二维数组数组名看作一个二级指针常量链接
    数组(名)是右值,而指针是左值?
    例:

    数组和指针是等效关系不是等价关系,一说指针对象,而数组非对象。

一维数组和指针很多时候可以通用如:
p[i] ⇔ *(p+i)
&p[i] ⇔ p+i

二维数组分配 ※

二维数组(指针)动态分配和释放
malloc工作只是开辟一块你要的内存(连续的),同时返回内存首字节的地址,但是他不限定你内存里的内容,malloc( 5*sizeof(char) ) 只是给你空出一段20字节的内存空间,并且给你他的首地址,而你实际要往内存里装什么,完全通过强制类型转换来限定,比如 int**p=(int**)malloc(n*sizeof(char*))
动态分配基本都要用到指针数组。

//二维都已知
char (*a)[N];//数组指针a = (char (*)[N])malloc(sizeof(char *) * m);printf("%d\n", sizeof(a));   //4,指针printf("%d\n", sizeof(a[0]));//N,一维数组free(a);
//二维未知
char **a;//二级指针int i;a = (char **)malloc(sizeof(char *) * m);//分配二级指针空间for(i=0; i<m; i++){a[i] = (char *)malloc(sizeof(char) * n); //分配一级指针空间,不保证a[0],a[1],...a[m]的值连续}printf("%d\n", sizeof(a));    //4,指针printf("%d\n", sizeof(a[0])); //4,指针for(i=0; i<m; i++){free(a[i]);}free(a);
//二维未知,连续内存
//法1(自上而下)
char **a;int i;a = (char **)malloc(sizeof(char *) * m);a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空间for(i=1; i<m; i++){a[i] = a[i-1] + n;}//采用如上内存分配方法,意味着将a的值初始化为m*n的二维数组首地址,且这块内存连续printf("%d\n", sizeof(a));    //4,指针printf("%d\n", sizeof(a[0])); //4,指针free(a[0]);free(a);
//二维未知,连续内存
//法2(自下而上、逆向思维)double *Array1D=new double[n*m];double **Array2D=new double* [n];for(int i=0;i<n;i++){Array2D[i]=&Array1D[i*m];}delete[] Array2D[0];//或Array1Ddelete[] Array2D;

法2参考
两种方法的差异在于后者需要两个变量名,而第一种由于直接对元素赋值,中间指针数组并不需要命名。

注意内存的释放都是先释放低级的,再释放高级的
此外,指针数组首地址不等于二维数组首地址,说明指针数组块和二维数组块不是重叠的,都有分配各自的空间。如图:

二维数组参数传递

传递的三种方法

指针的偏移量问题

  • 指针的偏移量=指针的当前值+n*sizeof(指针指向的数据类型)
    如    int (*a)[3]={0}; a是一个数组指针,a+1的偏移量是12个字节
    又如

  • 二维数组指针

int a[3][4],*p;
p=(int*)a;//将二维数组强制类型转化为一级指针,p++可以到12

左值和右值

左值(lvalue):一个标识非临时性对象的表达式。通常来说,可以将程序中所有带名字的变量看做左值
右值(rvalue):相对的,右值标识是临时性对象的表达式,这类对象没有指定的变量名,都是临时计算生成的。

引用

(1)左值引用
左值引用的声明是通过在某个类型后放置一个符号&来进行的。前文代码中的int & y = x;便是一个左值引用。
需要注意的是,在定义左值引用时,=右边的要求是一个可修改的左值。
(2)右值引用(不常用)
类似于左值引用,右值引用便是对右值的引用,它是通过两个&&来声明的

引用和指针有什么区别

我们知道,指针是在内存中存放地址的一种变量,cpu能够直接通过而变量名访问唯一对应的内存单元,且每个内存单元的地址都是唯一的。
而变量名和引用,都可以看做内存的一个标签或是标识符,计算机通过是否符合标识符判断是否为目标内存,而一个内存可以有多个标识符


参考:https://www.cnblogs.com/Bylight/p/10530274.html

函数参数传递、数组指针、二级指针、左值、引用相关推荐

  1. 左值、右值、左值引用、右值引用

    1. 左值 左值(lvalue,left value),顾名思义就是赋值符号左边的值,可以取地址.准确来说,左值是表达式(不一定是赋值表达式)后依然存在的持久对象. 可以将左值看作是一个关联了名称的内 ...

  2. 左值右值,左值引用和右值引用及其用途

    目录 1.左值和右值 2.引用 (1)左值引用 (2)右值引用 3.左值引用的用途 (1)作为复杂名称变量的别名 (2)用于rangeFor循环 (3)避免复制大的对象 (4)参与函数中的参数传递 4 ...

  3. C++面试 左值、右值、左值引用、右值引用

    1.左值和右值 左值(left-values),缩写:lvalues  ,located value 可定位值,其含义是可以明确其存放地址的值,更确切说对其的使用是基于地址 右值(right-valu ...

  4. [c++]-c++中的左值和右值、左值引用和右值引用、万能引用和引用折叠及完美转发

    1.左值和右值 1.1左值和右值定义 在c++中,左值是一个指向内存的东西,换句话来讲,左值有地址,保存在内存中,右值则为不指向任何地方东西,即不在内存中占有确定位置.一般来说,右值是暂时和短暂的,而 ...

  5. C语言指针(函数指针数组,二级指针)

    int (*p[num])( char*,int,int );int (*(*p)[num])(int a); 上一篇博客最后的两个例子的答案分别是:函数指针数组,函数指针数组的指针. 函数指针数组指 ...

  6. 二维数组的动态内存申请,采用子函数的方式 为二级指针申请内存,和释放内存

    原理:二级指针,行指针+列指针 照着葫芦画瓢就行. 方法一:用c语言malloc实现 #include<cstdio> #include<iostream> #include& ...

  7. 关于C语言中的数组指针、指针数组以及二级指针

    概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...

  8. 【C语言指针】 指针+-整数、指针-指针、解引用、指针数组、二级指针、结构体声明、初始化、传参

    目录 一.指针 1.指针是什么 1.1.一个单元1个字节 2.指针和指针类型 2.1.指针类型的意义 ① 解引用 ② + -整数 例:把每个整形里放1 每个字节里放1 总结: 3.野指针 3.1.野指 ...

  9. C++11 右值引用与常量左值引用保存临时变量(函数返回值)的底层分析

    右值引用保存临时变量(函数返回值)的问题 :临时变量是右值 1.普通变量接收函数返回值: 2.右值引用变量接收函数返回值: 3.用const int& 和右值引用是一样的效果,只是const ...

  10. C 结构体嵌套一级指针 二级指针 动态分配内存

    https://blog.csdn.net/xielinhua88/article/details/51364623 点击打开链接 #define _CRT_SECURE_NO_WARNINGS #i ...

最新文章

  1. mac mini 装UBUNTU后没有WIFI解决办法
  2. python主要用于系统编程_一文带你了解python是什么?能做什么?为什么(附赠40G项目实战+绝版电子书)...
  3. 【Python基础】5个Pandas技巧
  4. bzoj4636: 蒟蒻的数列
  5. docker容器构建_我如何容器化构建系统
  6. 淘宝京东设计师来看,电商Banner设计策略!
  7. 2020 时代的开发人员关键词:开源和远程办公
  8. SDelete v2.04安全地擦除磁盘未分配部分中存在的任何文件数据(包括已经删除或加密的文件)
  9. 操作系统文件保护及文件共享
  10. 通过命令符查看笔记本电脑的电池损耗
  11. (HG模块,简洁明了)Hourglass Module介绍
  12. 合宙-icool 开发板使用手册
  13. 看一个师兄的操作系统视频有感
  14. leetcode(力扣) 718. 最长重复子数组 1143. 最长公共子序列 1035. 不相交的线 (动态规划)
  15. 安全集成服务资质是什么都有哪些等级?申请安全集成服务资质认证有什么好处?
  16. python中strip_python中的strip是什么意思
  17. 毕业设计-基于深度学习的交通标识识别-opencv
  18. java漏斗代码_集算示例:10 行代码解决漏斗转换计算
  19. 通信软件设计基础(第2版)pdf分享
  20. Python3 集合(11)

热门文章

  1. ARKit:增强现实技术在美团到餐业务的实践
  2. 互联网热门职位薪酬报告
  3. 论文浅尝 | 用于嵌套命名实体识别的二部平面图网络(BiFlaG)
  4. 使用numpy实现神经网络模块
  5. 【TensorFlow】优化方法optimizer总结(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)解析(十三)
  6. Docker添加或者更改容器的端口映射
  7. 建网站如何选择好用的网站源码程序
  8. 二维数组求和 团队开发
  9. Android 为应用添加默认加载页
  10. DevExpress控件库----AlertControl提示控件