zoukankan      html  css  js  c++  java
  • C++学习笔记(五):指针和引用

    声明指针:

    1 //指针声明 * 号左右的空格是可选的,下面的定义都是正确的
    2 int *pointer1;
    3 int* pointer2;
    4 int*pointer3;
    5 int * pointer4;
    6 //注意: pointer5 是指针而 pointer6 不是
    7 int *pointer5, pointer6;
    8 //pointer7 和 pointer8 都是指针
    9 int *pointer7, *pointer8;

    指针的类型和指针所指向的类型:

    1 //指针的类型是int*,表示为int对象的指针
    2 //指针所指向的类型是int,表示该指针指向int对象
    3 int *pointer1;

    指针的值:

    指针表示指向对象位于内存中的地址,对于32位的系统来说就是一个无符号的32位数字(最多表示4GB内存),64位系统就是一个无符号的64位数字;

    取地址和取值:

    取一个对象的地址使用&符号,取一个指针指向的对象的值使用*符号;

    1 int num = 100;
    2 int *p = #
    3 p = 101;//错误, 这是直接改变指针的指向,指向内存地址101
    4 *p = 101;//正确, 修改了num的值

    空指针:

    表示这个指针没有指向一块有意义的内存,对空指针应用delete是安全的。

    1 //没有赋值的指针
    2 int *p;
    3 //赋值为NULL或0的指针
    4 int *p = NULL;
    5 int *p = 0;

    指针的算术运算:

    指针的加减法会以sizeof(指针指向的类型)来处理,比如:

    1 int num = 100;
    2 int *p = #
    3 p++;//指针的地址指向+4之后的位置
    4 ptr += 5;//指针的地址指向+20之后的位置

    指向指针的指针:

    指针同样可以指向另一个指针,

    1 int **ptr;//指向一个int类型指针的指针

    指针和数组:

    数组的数组名其实可以看作一个指针,

    1 int array[10]={0,1,2,3,4,5,6,7,8,9},value;
    2 value=array[0];//也可写成:value=*array;
    3 value=array[3];//也可写成:value=*(array+3);
    4 value=array[4];//也可写成:value=*(array+4);

    在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。

    在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。

    在很多情况下,可以相同的方式使用指针名和数组名。对于它们,可以使用数组方括号表示法,也可以使用解除引用运算符(*)。在多数表达式中,它们都表示地址。区别之一是,可以修改指针的值,而数
    组名是常量。

    成员调用:

    结构变量.成员名

    (*结构指针变量).成员名

    结构指针变量->成员名

    const和指针

    使用const修饰指针时有两种意思:一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。

    先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法:

    1 const int* p;
    2 int const* p;

    可以理解为,p 是一个指针,它指向的内容是 const int 类型。p 本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的。

    再说const指针,它的意思是指针本身的值是不能被修改的。它只有一种写法:

    1 int* const p = 一个地址;

    因为指针本身的值是不能被修改的所以它必须被初始化,这种形式可以被理解为,p 是一个指针,这个指针是指向 int 的 const 指针。它指向的值是可以被改变的如 *p=3。

    最后一种情况是这个指针本身和它指向的内容都是不能被改变的:

    1 const int* const p=一个地址;
    2 int const* const p=一个地址;

    总结下规律:指向const的指针(指针指向的内容不能被修改)const关健字总是出现在*的左边而const指针(指针本身不能被修改)const关健字总是出现在*的右边,那不用说两个const中间加个*肯定是指针本身和它指向的内容都是不能被改变的。

    最后上一个例子:

     1 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main(int argc, char *argv[])
     6 {
     7     int a=3;
     8     int b;
     9     
    10     /*定义指向const的指针(指针指向的内容不能被修改)*/ 
    11     const int* p1; 
    12     int const* p2; 
    13     
    14     /*定义const指针(由于指针本身的值不能改变所以必须得初始化)*/ 
    15     int* const p3=&a; 
    16     
    17     /*指针本身和它指向的内容都是不能被改变的所以也得初始化*/
    18     const int* const p4=&a;
    19     int const* const p5=&b; 
    20     
    21      p1=p2=&a; //正确
    22      *p1=*p2=8; //不正确(指针指向的内容不能被修改)
    23     
    24      *p3=5; //正确
    25      p3=p1; //不正确(指针本身的值不能改变) 
    26     
    27      p4=p5;//不正确 (指针本身和它指向的内容都是不能被改变) 
    28      *p4=*p5=4; //不正确(指针本身和它指向的内容都是不能被改变) 
    29      
    30     return 0; 
    31 }

    声明引用:

    1 int i = 10;
    2 int& ref = i;

    引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。

    指针和引用的区别:

    1. 指针是一个实体,而引用仅是个别名;
    2. 引用使用时无需解引用(*),指针需要解引用;
    3. 引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终;
    4. 引用没有 const,指针有 const,const 的指针不可变;
    5. 引用不能为空,指针可以为空;
    6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
    7. 指针和引用的自增自减(++、--)运算意义不一样。

    引用的弊端:
    当一个类中包含引用成员时,这个类就无法使用语言生成的默认构造函数,拷贝构造函数和赋值函数。这是因为引用不能为空,必须在构造函数中为引用成员赋值,语言默认生成的函数不具备这个功能。默认构造函数在C++中时非常重要的概念,特别是在使用STL时,因此为了默认构造函数,必须摒弃引用成员变量。

    引用使用总结:

    1. 函数直接的参数传递,优先考虑引用。
    2. 函数返回值,优先考虑引用。
    3. 类的数据成员,尽量不用引用。
  • 相关阅读:
    54. 八皇后问题[eight queens puzzle]
    53. 特殊的O(n)时间排序[sort ages with hashtable]
    52. 不用+、-、×、÷做加法[add two numbers without arithmetic]
    C++基础知识面试精选100题系列(11-20题)[C++ basics]
    C++基础知识面试精选100题系列(1-10题)[C++ basics]
    洛谷 P1479 宿舍里的故事之五子棋
    洛谷 P2084 进制转换
    codevs 1700 施工方案第二季
    POJ 3278 Catch That Cow(求助大佬)
    POJ 2251 Dungeon Master
  • 原文地址:https://www.cnblogs.com/hammerc/p/3966895.html
Copyright © 2011-2022 走看看