1. 引用:是对象的别名,其内部存放的时一个对象的地址,通过引用可以操纵对象,引用的所有操作实际上都是应用在它所指的对象身上,包括取地址操作符。引用的一些特性:
    • 引用定义时必须被初始化,引用一旦定义就不能再指向其他对象
    • const引用可以用不同类型的对象初始化,只要能从这种类型转换到引用类型,对于不可寻址的值如常量,编译器为了实现引用会生成一个临时对象,引用实际指向该对象,非const引用不能指向需要临时对象的对象或值,会导致编译错误
    • 不能定义引用类型的数组
    • 从上一点可以看出引用内部会存放一个内存地址,所以引用也是占内存的,但不能改变它的指向
    • 函数返回引用时要注意,引用不能指向函数的局部变量,因为在函数执行完后局部变量内存会被清空,所以引用的值会没有意义
  2. 指针:指针变量所存的内容时它指向的内存地址,用法有:
    • TYPE *ptr:定义一个指向TYPE的指针
    • TYPE *ptr[n]:定义一个指向TYPE的指针的数组
    • TYPE (*ptr)[n]:定义一个指向数组的指针,数组元素数目为n.ptr中存放的其实时数组第一个元素的地址,所以取数组中第一元素要用**ptr,两次解指针操作
      int arr[3]={1,2,3};
      //ptr是指针,该指针类型是int[3]
      int (*ptr)[3]=&arr;

      cout << **ptr << endl;//第一次解指针时得到数组地址,第二次解指针取数组中的值

    • TYPE **ptr:定义一个指向TYPE类型的指针的指
    • 空类型指针(void *)可以被任何类型数据指针类型的地址赋值,包括函数指针.由于不知道该地址的数据类型,所以不能操作空类型指针所指的对象,只能传送该地址或与其他地址值比较
      int add(int a,int b)
      {return a+b;} void *ptr = &add;//vs 2012编译通过
  3. 指针与函数:
    • TYPE (*ptr)(int,int):定义一个指向函数的指针,函数返回类型为TYPE,包含两个int参数。函数指针不是类型安全的,不同签名的函数指针之间能够强制转换,编译器能通过,但执行时候会出现不可预期的行为. 函数名其实时指向该类型函数的指针,将取地址符作用于函数名也能得到函数地址,如下add与&add是相同类型

      void add(int a,int b)
      {return ;} typedef int (*FunPtr)(int a,int b,int c);
      FunPtr func =(FunPtr)add;//编译能通过,执行时行为不可预期
    • 函数指针的数组:int(*Func[10])(int,int),Func是一个拥有10个元素的数组,每个元素都是一个指向函数的函数指针,这种定义方式可读性较差,可以使用如下方式
      typedef (*FuncPtr)(int,int)
      FuncPtr Func[10]
    • 返回类型为函数指针的函数:
      int(*func(int))(int *,int)//声明 一个函数func,返回类型为int (*)(int*,int)
      
      typedef int (*FuncPtr)(int *,int)//使用typedef提高代码可读性
      FuncPtr func(int *,int)
    • 要注意的是函数名不能作为函数的返回类型,只有函数指针可以,另外函数名作为参数传递给函数时,也会被转换为函数指针,对函数名也不能使用解指针操作符
  4. 指针与引用的区别:
    • 引用不能为空,指针可以

    • sizeof 引用得到的是变量的大小,sizeof指针得到的是指针本身的大小,任何指针类型在32位系统都是4字节
    • 引用时类型安全的,指针不是
  5. 指针与数组的关系:
    • 数组与指针是两种不同类型,数组有明确数量,指针只是个地址值.

    • 单独使用数组名时,编译器会把数组名转换为一个指针常量,指向数组中第一个元素的地址。对于二维数组数组名则是指针的指针
      int arr[3]={1,2,3}
      
      //如下语句作用一样
      int *ptr = arr;
      int *ptr=&arr[0] int arr[2][3]={{1,2,3},{4,5,6}}
      int (*ptr)[3];//定义一个指向数组的指针,数组元素数目为3
      ptr = &arr[1]; cout << **p << endl 输出4,注意是两次解指针操作
    • 对于二维数组,数组名其实是一个指针,可以叫做行指针,该指针指向一个数组的首地址,数组元素数目为二维数组的列数.所以数组名也可以认为是指针的指针.
      int arr[2][3]={{1,2,3},{4,5,6}};
      cout <<"arr: "<< arr << endl;
      cout <<"arr+1: " << arr+1 << endl;//第二行的地址 cout << "*arr: " << *arr << endl;
      cout << "*(arr+1): " << *(arr+1) << endl;//第二行的首地址 cout <<"arr[0]: " << arr[0] << endl;
      cout <<"&arr[0]: " << &arr[0] << endl;
      cout <<"&arr[0]+1: " << &arr[0]+1 << endl; cout <<"arr[1]: " << arr[1] << endl;
      cout <<"&arr[1]: " << &arr[0]+1 << endl;

C++之指针与引用,函数和数组的更多相关文章

  1. 数组类型与sizeof与指针的引用

    以char类型为例: char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char char *p = a;     ...

  2. 动态创建二维vector数组 C和C++ 及指针与引用的区别

    二维vectorvector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二维vector 动态创建m*n的二 ...

  3. 通过数组初始化链表的两种方法:指向指针的引用node *&tail和指向指针的指针(二维指针)node **tail

    面试高频题:单链表的逆置操作/链表逆序相关文章 点击打开 void init_node(node *tail,char *init_array) 这样声明函数是不正确的,函数的原意是通过数组初始化链表 ...

  4. C++基础回顾2(函数, 指针和引用)

    接着回顾函数.指针和应用. 函数 1.多维数组作为形参时,第一维的大小可以省略(也可以不省略),但是其他维的大小必须指定.比如二维数组形参,int array[3][]不正确,int arry[][1 ...

  5. (C/C++)区别:数组与指针,指针与引用

    1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型 ...

  6. C++中指针和引用、数组之间的区别

    指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名,引用初始化后不能改变指向.使用时,引用更加安全,指针更加灵活. 初始化.引用必须初始化,且初始化之后不能呢改变:指针可以不必初始化 ...

  7. C++之指针,引用与数组

    引用只是对象的另一个名字,通过在变量名前面添加"&”符号来定义,而指针保存的是另一个对象的地址,它们两都提供了间接访问所服务变量的途径. 但是它们的差别还是挺大的: 先从它们的值说起 ...

  8. <c和指针>学习笔记3之函数和数组

    1 函数声明 (1)原型 告诉编译器函数的参数数量和每个参数的类型以及返回值的类型.编译器通过检查原型之后,就可以检查这个函数得调用,从而来确保参数正确,返回值无误. 通用技巧,将原型写在一个头文件当 ...

  9. PHP中使用数组指针函数操作数组示例

    数组的内部指针是数组内部的组织机制,指向一个数组中的某个元素.默认是指向数组中第一个元素通过移动或改变指针的位置,可以访问数组中的任意元素.对于数组指针的控制PHP提供了以下几个内建函数可以利用. ★ ...

随机推荐

  1. [jzoj 5664] [GDOI2018Day1模拟4.6] 凫趋雀跃 解题报告(容斥原理)

    interlinkage: https://jzoj.net/senior/#contest/show/2703/3 description: solution: 考虑容斥原理,枚举不合法的走的步数 ...

  2. caffe study- AlexNet 之算法篇

    在机器学习中,我们通常要考虑的一个问题是如何的“以偏概全”,也就是以有限的样本或者结构去尽可能的逼近全局的分布.这就要在样本以及结构模型上下一些工夫. 在一般的训练任务中,考虑的关键问题之一就是数据分 ...

  3. Creative Cloud 无法连接问题

    防火墙允许 PDApp.exe Windows:Program Files\Common Files\Adobe\OOBE\PDApp\core Mac OS:应用程序 > 实用工具 > ...

  4. struts2学习之基础笔记1

    第6章 Strusts 2框架 1  引出 Web App  àà MVC  àà View 视图(jsp,html,JS) | C(Servlet)Filter,Listneer | M(数据bea ...

  5. struts2学习之基础笔记8

    文件的上传和下载 上传 步骤1:在文件上传表单中设置method和enctype属性值 格式:<s:form method=”post” enctype =”multipart/ form.da ...

  6. css元素垂直居中方法

    1.Line-height 适用情景:单行文字垂直居中技巧 这个方式应该是最多人知道的了,常见于单行文字的应用,像是按钮这一类对象,或者是下拉框.导航此类元素最常见到的方式了.此方式的原理是在于将单行 ...

  7. 性能优化实战-join与where条件执行顺序

    昨天经历了一场非常痛苦的性能调优过程,但是收获也是刻骨铭心的,感觉对sql引擎的原理有了进一步认识. 问题起源于测试人员测一个多条件检索的性能时,发现按某个条件查询会特别慢.对应的sql语句简化为: ...

  8. Oracle [sys_connect_by_path] 函数

    create table test ( NO NUMBER, VALUE VARCHAR2(100), NAME VARCHAR2(100) ); -------------------------- ...

  9. 安装全局可执行的gulp

    gulp需要作为项目的开发依赖(devDependencies)安装,全局安装了gulp是无法执行项目的,不单单需要全局安装 gulp:npm install gulp -g,也需要作为项目的开发依赖 ...

  10. Python内置数据结构之字典dict

    1. 字典 字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下.键可能是数(整数索引).字符串或元组.字典(日常生活中的字典和Python字典)旨在让你能够轻松地找到特定的单 ...