读钱能的C++有感

一.C++语言拥有在运行时获得变量的地址和操纵地址的能力;指针用于数组,作为函数参数,用于内存访和      堆内存操作。

二.int* ptr中的*放在指针的定义中为指针定义符;cout<<*ptr<<endl,中的*放在可执行语句中称为间接引用操作符。注:间接引用的指针既可用于右值也可用于左值,非指针变量不能用间接引用操作符。

  •    指针变量的地址:例:

        #include <iostream.h>

         void main() 

        {

         int iCount=18;

        int * iPtr=&iCount;

       *iPtr=58;

       cout<<iCount<<endl;

      cout<<iPtr<<endl;//输出为地址

     cout<<&iCount<<endl;//输出地址

     cout<<*iPtr<<endl;

     cout<<&iPtr<<endl;//输出指针本身的地址

    }

  • 指针在使用前要进行初始化

        int count;

       int* iPtr;

      *iPtr=58;

       指针忘了赋值比整型变量忘了赋值危险得多。

  •      指针与数组

         数组名可以拿来初始化指针,数组名就是数组第一个元素的地址

        即:a等于&a[0];

       int a[100];

      int* iPtr=a;

     我们有第I个元素等价于:a[i]等价于*(a+i)等价于iPtr[i]等价于*(iPtr+i).

     下标操作是针对地址而不仅仅是针对数组名的;数组名是一指针,它的类型是指向数组元素的指针。

     例:int iArray[]={1,4,2,7,13,32,21,48,16,30};

            sizeof(*iArray)表示数组元素类型所占的字节数,它可以表示成sizeof(int).

    注:数组名是指针常量,区别于指针变量,所以,给数组名赋值是错误的。

    例:int iArray[100];

           int sum=0;

           for(int i=0;i<100;i++)

            {

               sum+=iArray;

              iArray++;//error :数组名不是左值

           }

            注:数组名表示内存中分配了数组的固定位置,修改了这个数组名,主会丢失数组空间,所以数组名所代表的地址不能被修改。

三.  堆内存分配和const指针

  •       堆允许程序在运行时,申请某个大小的内存空间。
  •  const 指针:

               const int a=78;const int pi=&a;//指针指向的地址中的值为常量,不可被修改。

               定义指向常量的指针只限制指针的间接访问操作,而不能规定指针指向的值本身的操作规定性。

  •     指针常量:

                 例:char* const pc="asdf";//在定义指针常量时必须初始化,这里初始化的值是字符串常量的地址。

  •     指向常量的指针常量:

                例:const int ci=7;

                       const int * const cpc=&ci;

                注:以上告诉编译器,cpc和*cpc都是常量,它们都不能作为左值进行操作。

  •    指针与函数

                一旦把数组作为参数传递到函数中,则在栈上定义了指针,可以对该指针进行递增,递减操作。

                例:

                    #include <iostream.h>

                   void sum(int array[],int n)

                 {

                    int sum=0;

                   for(int i=0;i<n;i++)

                   {

                       sum+=*array;

                       array++;

                  }

                cout<<sum<<endl;

                }

               void main()

               {

                    int a[10]={1,2,3,4,5,6,7,8,9,10};

                     sum(a,10);

                }

  •  使用指针修改函数参数
  •  指针函数

              指针函数不能把在它内部说明的具有局部作用域的数据地址作为返回值。

              例:

                int *getInt(char* str)

               {

                   int value=20;

                   cout<<str<<endl;

                   return &value;//将局部变量的地址返回是不妥的

               }

               可以返回全局或静态变量的地址。

              void 指针是空类型指针,它不指向任何类型,即void指针仅仅只是一个地址,所以空类型指针不能进行指针运算,也不能进行间接引用。

  • 字符指针

            注:字符串常量的类型是指向字符的指针,它与字符数组名同属于一种类型,字符串常量在内存中以'/0'结尾。

            字符串常量的格式和特点:字符串常量通常存放在内存data区中的const区,如果字符数组是全局变量,就存放在内存的DATA区中全局或静态区,如果字符数组是局部变量,就存放在内存的栈区等。

           由于字符串常量的地址属性,所以两个同样字符组成的字符串常量是不相等的。

            例:#include <iostream.h>

                  void main()

                 {

                   if("join"=="join")

                         cout<<"equal/n";

                   else

                        cout<<"not equal/n";

                  }

                   结果:not equal

                  注:输出字符指针就是输出字符串,输出字符指针的间接引用,就是输出单个字符。

                          两个字符常量的比较是地址的比较,两个数组名的比较也是地址的比较。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值