更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

C++_指针地址内存_数据结构_文件操控知识

  • 发布:C++培训
  • 来源:学习笔记
  • 时间:2017-10-26 16:56

C++_指针地址内存_数据结构_文件操控知识

1 指针与地址

定义的时候 加几个 * 就是几级地址。

使用的时候 加几个 * 或者[] 就是还原成指针所指向的数据。 加 几个& 就是把数据还原成他的地址。

const修饰符

#include"iostream"

using namespace std;

int main()

{

int *p1;

const int *p2;

const int **p3;

//只要不改变你 const 就是对的赋值方式。

//p1=p2;// 可以改变const 所以错误。

//p2=p1;// 不改变 const 正确;

//p3=&p1;// 可以改变const 所以错误。

//因为 p3=&p1 再定义一个数 const int a=10;

//*p3=&n; *p1=10;这样就达到了改变 const 的目的。所以 p3 = &p1 不可以。

return 0;

}

register修饰符

register 修饰的变量 在寄存器中。寄存器是读取最快的存储地点。如果某个东西在程序中经常使用 加上这句就会快到意想不到。

但是最好不要乱加。有时候加上去之后反而更慢。因为寄存器空间很小,加上一个固定的数,那么其它数据就无法使用该地点,反而阻碍程序的速度。

#include"iostream"

using namespace std;

int main()

{

register int a=3;

return 0;

}

二级地址

#include"iostream"

using namespace std;

int main()

{

int a[3][5];

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

{

for(int j=0;j<5;j++)

{

a[i][j]=i*5+j+1;

//等价于 *(*(a+i)+j)=i*5+j;

}

}

int *p1[5];//宽度为 1 的五个一级指针。

int (*p2)[5];//宽度为 5 的一个一级指针。

p2=a;

cout<<"****"<<endl;

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

{

for(int j=0;j<5;j++)

{

cout<<*(*(p2+i)+j)<<endl;

//等价于 cout<<p2[i][j]<<endl;

}

}

return 0;

}

函数指针

有时候不同的函数有相同的返回值,有相同的输入变量的个数和类型。可以用一个指针指向该函数。调用指针,加快程序运行,方便使用。声明方式和调用见如下代码。

#include"iostream"

using namespace std;

void f1(int a,int b)

{

cout<<a<<" "<<b<<endl;

}

void f2(int a,int b)

{

cout<<"这是第二个函数了"<<endl;

}

int main()

{

void (*p)(int ,int );

p=f1;

p(1,2);

p=f2;

p(1,3);

return 0;

}

指针函数

指针函数就是返回返回指针的函数。就像 int 函数 是返回 int 的函数。

#include"iostream"

using namespace std;

//返回比 n 大的位置。

int *getshuzu(int a[],int lenth,int n)

{

int geshu=0;

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

{

if(a[i]>n)

{

geshu++;

}

}

int *sult=new int[geshu+1];//给这个指针分配 geshu 个 int 型内存空间,让函数结束后 内存不被释放。

int temp=0;

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

{

if(a[i]>n)

{

sult[temp++]=i;

}

}

sult[temp]=-1;//用 -1 标识 结束。因为没有位置是 -1 .

return sult;

}

int main()

{

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

int *p=getshuzu(a,10,5);//得到比 5 大的位置的数组。

cout<<"比 5 大的位置为:"<<endl;

for(int i=0;p[i]!=-1;i++)

{

cout<<p[i]<<" ";

}

cout<<endl;

return 0;

}

2 分配销毁内存与变量的生命期和作用域

存储区域

代码区:存放代码。

静态存储区:存放全局的变量和静态变量。

栈区:存放动态局部变量。

堆区:存放申请内存的变量。

作用域就是函数或者变量可以发挥作用的区域。一般一个花括号内的东西就在本花括号内有作用。比如你把函数写在主函数外面,那么全局都能调用这个函数。但是你把函数写在主函数里,那么只有主函数可以调用这个函数。同样,你把变量写在外面全局都能使用,你把变量写在某个花括号内,那么只有这个花括号内才能使用这个变量。

添加自定义头文件

在项目文件夹里,新建一个文本文档,后缀改为 .h 在里面写好代码后 可以直接包含进该文件夹里的其他文件。

可以在编译器默认的头文件文件夹里自己写头文件,这样,所有用该编译器的文件都可以直接包含这个头文件。

修改头文件路径,用该编译器的文件可以直接使用该头文件。修改图标也在对应的设置里。

代码示范

主函数里:

#include"iostream"

using namespace std;

#include"abc.h"

int main()

{

f();

f();

f();

f();

f();

cout<<endl;

return 0;

}

自定义的头文件里

#include"iostream"

using namespace std;

void f()

{

static int temp2=0;

int temp1=0;

temp2++;

temp1++;

cout<<"int temp1 = "<<temp1<<" static temp2 = "<<temp2<<endl;

}

运行之后的结果为:

new malloc calloc realloc 分配内存在程序结束后才释放内存。

内存分配

#include"iostream"

#include"stdlib.h"//C语言的 malloc 和 free 等内存函数 用到的头文件。也可以是 #include"malloc.h"

using namespace std;

int main()

{

int *a1=new int;

int *a2=new int[10];

int *b1=(int *)malloc(sizeof(int));//malloc 分配内存不赋值。

int *b2=(int *)calloc(10*sizeof(int));//calloc 分配内存把内存全调成 0

realloc(b2,20*sizeof(int));//将内存大小扩大分配到 20 个 int 。 C语言的函数。

//如果 C++ 想扩大,可以用 realloc 。也可以新 new 一个内存 再把旧内存里的数据复制过去。再删除旧的内存。

//过程如下

int *a3=new int[3];

a3[0]=0;a3[1]=1;a3[2]=2;

int *a33=new int[5];

a33[0]=a3[0];a33[1]=a3[1];a33[2]=a3[2];

a33[3]=3;a33[4]=4;

delete []a3;

delete a1;//删除一个空间的内存。

delete []a2;//删除多个时候,前面加上括号

free(b1);

free(b2);

delete []a33;

cout<<endl;

return 0;

}

3 文件输入输出

fopen fclose FILE EOF fgets fgetc frintf fputs

并不实用,不学也罢。都是简单的函数。自己调用试试就知道了。

题目名称

begin

描述

编写一个程序,输入一个整数,判断它是否为3位整数,如果是,请输出YES,如果不是,请输出NO。

输入样例1

1000

输出样例1

NO

输入样例2

999

输出样例2

YES

//要考虑 2147483748*2-100;或者double

//2,147,483,748 × 2 + 100 = 4294967596

#include"iostream"

#include"cstring"

using namespace std;

int main()

{

freopen("begin.in","r",stdin);

freopen("begin.out","w",stdout);

char a[1000000];

cin.getline(a,1000000);

int x=strlen(a);

for(int i=0;a[i]!='\0';i++)

{

if(a[i]=='.')

{

x=i;

break;

}

}

if(a[0]=='-')

{

cout<<"NO";

}

else

{

if(x==3)

{

cout<<"YES";

}

else

{

cout<<"NO";

}

}

return 0;

}

4 结构体与数据结构

#include"iostream"

using namespace std;

typedef struct stu

{

char name[20];

int xuehao;

double fenshu;

}stu;

// 普通变量 用 点 列出它的成员。

void P(stu a)

{

cout<<"姓名"<<a.name<<endl<<"学号:"<<a.xuehao<<endl<<"分数"<<a.fenshu<<endl;

}

// 指针 用 箭头 -> 列出成员 。

void shuru(stu *a)//为了能够改变 输入的数据。这里用引用。

{

cin>>a->name;

cin>>a->fenshu;

cin>>a->xuehao;

}

int main()

{

stu a={"temmo",10,59.9};

P(a);

stu b;

shuru(&b);

P(b);

return 0;

}

5 线性表与链表

线性表是连续存储的,效率高,占用内存少。链表是通过指针链接的内存块,不是连续存储,效率比线性表低一些,还要给指针分配地址,占用内存大一些。

虽然听上去,线性表结构更加优越,但是当数据块太大的时候,不能使用,因为计算机内存没那么大块地方。

实际应用中,为了兼顾二者优点,把线性表和链表组合使用。

一般的线性表

一般的线性表有3部分组成。数据,当前长度,总空间,这三个部分。

//线性表

#include"iostream"

#include"cstdlib"

using namespace std;

typedef struct xian

{

int nowlength;//当前长度

int sumlength;//总长度

int *data;//数据,可以有很多数据。这里为了方便我写 一个数据。

}xian;

//创建线性表。长度为 size 。

xian chuangjian()

{

xian n;

n.sumlength=3;

n.nowlength=0;

n.data=new int[3];

return n;

}

//销毁链表。

void xiaohui(xian *n)

{

delete [](n->data);

n->nowlength=0;

n->sumlength=0;

}

//输出函数

void shuchu(xian n)

{

cout<<"*******"<<endl;

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

{

cout<<"第 "<<i<<" 个数据为:"<<n.data[i]<<endl;

}

cout<<"*******"<<endl<<endl;

}

//在第 pos 个位置 插入数据。

void charu(xian *n,int shuju,int pos)

{

n->nowlength++;

while(n->nowlength>=n->sumlength)

{

n->sumlength+=10;//如果满了,就增加一些内存。

n->data=(int *)realloc(n->data,n->sumlength*sizeof(int));

}

n->data[pos]=shuju;

}

int main()

{

xian head=chuangjian();

charu(&head,1,0);

charu(&head,2,1);

charu(&head,3,2);

charu(&head,4,3);

shuchu(head);

xiaohui(&head);

return 0;

}

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C++反射机制:元数据类型类型推导和成员
下一篇:C++进阶-STL容器

C语言创建windows窗口实例

C++回调函数是什么?

C++ shared_ptr和动态数组

C语言有哪些关键词,C语言44个关键词大全

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省