C++学习备忘录

gcc -S hello.c    他将生成.s的汇编代码,可以用文本编辑器查看。

gcc -o hello.exe hello.c  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out

 

标准输入和输出

下面是使用这段代码序列的一个例子 
#include <iostream>
#include <string>
using namespace std;


int main()
{
 string word;
 while ( cin >> word )
  cout >> "word read is: " >> word >> '\n';
 cout >> "ok: no more words to read: bye!\n";
 return 0;
}

 

文件输入和输出

下面是一个简单的程序 它从一个名为 in_file 的文本文件中读取单词 然后把每个词写
到一个名为out_file的输出文件中 并且每个词之间用空格分开 
#include <iostream>
#include <fstream>
#include <string>
using namespace std;


int main()
{
 ofstream outfile( "out_file" );
 ifstream infile( "in_file" );
 if ( ! infile ) {
  cerr << "error: unable to open input file!\n";
  return -1;
 }
 if ( ! outfile ) {
  cerr << "error: unable to open output file!\n";
  return -2;
 }
 string word;
 while ( infile >> word )
  outfile << word << ' ';
 
 return 0;
}

 

数组备忘

C++不支持数组的抽象 也不支持对整个数组的操作,我们有时会希望对整个数组进行操作;数组类型本身没有自我意识 它不知道自己的长度 我们必须另外记录数组本身的这些信息

 

 

动态内存分配和指针

在 C++中 对象可以静态分配——即编译器在处理程序源代码时分配 也可以动态分配——即程序执行时调用运行时刻库函数来分配 这两种内存分配方法的主要区别是效率与灵活性之间的平衡准则不同 出于静态内存分配是在程序执行之前进行的 因而效率比较高  但是 它缺少灵活性 它要求在程序执行之前就知道所需内存的类型和数量 例如 利用静 态分配的字符串数组 我们无法很容易地处理和存储任意的文本文件 一般来说 存储未知 数目的元素需要动态内存分配的灵活性 
     到目前为止 所有的内存分配都是静态的 例如 以下定义  int ival = 1024; 指示编译器分配足够的存储区以存放一个整型值 该存储区与名字 ival 相关联 然后用数值 1024 初始化该存储区 这些工作都在程序执行之前完成 
     有两个值与对象 ival 相关联 一个是它包含的值——本例中为 1024 另一个是存放这个值的存储区的地址 在 C++中 这两个值都可以被访问 当我们写出下面的代码时 int ival2 = ival + 1
     我们访问 ival 所包含的值 并把它加 1 然后再用该新值初始化 ival2 在本例中 ival2初始值为 1025 怎样访问和存储内存地址呢 
    C++支持用指针类型来存放对象的内存地址值 例如 为了声明一个能存放 ival 内存地
址的指针类型 我们可以这样写 
// 一个指向 int 类型的指针
int *pint;
    C++预定义了一个专门的取地址 address-of 操作符 & 当我们把它应用在一个对象上时 返回的是对象的地址值 因此 为了将 ival 内存地址值赋给 pint 我们可以这样写 
int *ping;
pint = &ival; // 把 ival 的地址 pint 22                                                                          
      为了访问 pint所指向的实际对象 我们必须先用解引用 dereference 操作符 * 来解除 pint 的引用 dereference pint 例如 下面我们通过 pint 间接地给 ival 加 1 
 
// 通过 pint 间接地给 ival 加 1
*pint = *pint + 1;
     它等价于下面直接对 ival 操作的语句 
 
// 直接给 ival 加 1
ival = ival + 1;
     在本例中 使用指针间接地操作 ival 没有什么实际的好处 这样做比直接操作 ival 的效率要低 而且又容易出错 我们只是用它来简单地介绍一下指针 在C++中 指针的主要用处是管理和操纵动态分配的内存 
     静态与动态内存分配的两个主要区别是 
    1.静态对象是有名字的变量 我们直接对其进行操作 而动态对象是没有名字的变量我们通过指针间接地对它进行操作 稍后我们会看到一个例子 
    2.静态对象的分配与释放由编译器自动处理 程序员需要理解这一点 但不需要做任何事情 相反 动态对象的分配与释放 必须由程序员显式地管理 相对来说比较容易出错 它通过new和 delete两个表达式来完成 
    对象的动态分配可通过new表达式的两个版本之一来完成 第一个版本用于分配特定类型的单个对象 例如 
int *pint = new int( 1024 );
     分配了一个没有名字的 int 类型的对象 对象初始值为 1024 然后 表达式返回对象在内存中的地址 接着 这个地址被用来初始化指针对象 pint 对于动态分配的内存 惟一的访问方式是通过指针间接地访问 
    new表达式的第二个版本 用于分配特定类型和维数的数组 例如  int *pia = new int[ 4 ];
     分配了一个含有四个整数元素的数组 不幸的是 我们没有办法给动态分配的数组的每个元素显式地指定一个初始值 
       分配动态数组时一个常令人迷惑的问题是 返回值只是一个指针 与分配单一动态对象的返回类型相同 例如 pint 与 pia 的不同之处在于 pia 拥有四元素数组的第一个元素的地址 而 pint 只是简单地包含单一对象的地址 当用完了动态分配的对象或对象的数组时 我们必须显式地释放这些内存 我们可以通过使用 delete表达式的两个版本之一来完成这件事
情 而释放之后的内存则可以被程序重新使用 单一对象的 delete表达式形式如下 
// 删除单个对象
delete pint;
     数组形式的 delete表达式如下 
// 删除一个对象数组
delete [] pia;
     如果忘了删除动态分配的内存 又会怎么样呢 如果真的如此 程序就会在结束时出现内存泄漏 memory leak 的问题 内存泄漏是指一块动态分配的内存 我们不再拥有指向这 23 块内存的指针 因此我们没有办法将它返还给程序供以后重新使用 现在大多数系统提供识别内存泄漏的工具 可以向系统管理员咨询 。

 

#include <iostream>
using namespace std;
int main(){
        int aa=1;
        int *pint;//声明指针
        pint=&aa;//赋地址
        cout << *pint;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值