一,寻址

  1. 通过变量名
  2. 通过内存地址

取地址运算符&,用来获得变量的地址.

void getAddress() {int var;cout<<"var address is: "<<&var<<endl;
}

输出结果是:var address is: 0x7ffcf4dd4e14

为何这里是12位的16进制呢,换成2进制就是48位,难道我的机器不是64位机吗?

二,对齐

内存对齐,文件对齐

程序在编译链接后会被分割成一个个区块,而区块在内存和文件中按照一定的规律对齐.

//32位系统内存对齐值是:1000H == 4KB
//64位系统内存对齐值是:2000H == 8KB
//文件对齐值是:200H

操作系统处理内存时内存页是4KB

https://blog.csdn.net/zyq522376829/article/details/46357691

三,指针

既然指针变量存放的是一个地址,而32位系统的地址都是4个字节,为什么不用一个整型变量来存储而要发明指针呢?

如何根据指针变量来获取指针所存地址对应的值?--Deference(解引用),即在指针变量前加*号.

如std::cout<<*aPtr<<endl;

因此1,变量a和a的指针aPtr,代表同一个值,即a == *aPtr;

因此2,*aPtr = -100,将会修改a的值.

(1) *的两种用途:

1. 用于创建指针

int *mPtr = &myInt;

2. 对指针进行解引用

*mPtr = 123456;

(2) 指针与数组

数组的名字就是一个指针,它指向数组的基地址(也就是第一个元素的地址).因此,下面两句等价:

int *arrPtr1 = &mArray[0];
int *arrPtr2 = mArray;

指针式遍历数组:intPtr++;

void travesalArray(){const unsigned short SIZE = 5;int intArr[SIZE] = {1,2,3,4,5};char charArr[SIZE] = {'F','i','s','C','o'};int *intPtr = intArr;char *charPtr = charArr;cout<<"intager array output: "<<endl;for(int i=0; i<SIZE; i++){cout<<*intPtr<<" at "<<reinterpret_cast<unsigned long>(intPtr)<<endl;intPtr++;}cout<<"character array output: "<<endl;for(int i = 0; i<SIZE; i++){cout<<*charPtr<<" at "<<reinterpret_cast<unsigned long>(charPtr)<<endl;charPtr++;}
}

输出结果如下:

intager array output: 
1 at 140729290089744
2 at 140729290089748
3 at 140729290089752
4 at 140729290089756
5 at 140729290089760
character array output: 
F at 140729290089776
i at 140729290089777
s at 140729290089778
C at 140729290089779
o at 140729290089780

四,结构体

(1) 结构体创建和使用

void tryStruct() {struct Student {string name;int age;char gender;};//第一种方式,赋值one by oneStudent stu1;stu1.name = "Sessy";stu1.age = 19;stu1.gender = 'F';cout<<"student1 info: "<<endl;cout<<"+name: "<<stu1.name<<endl;cout<<"+age: "<<stu1.age<<endl;cout<<"+gender: "<<stu1.gender<<endl;cout<<"-----------------------"<<endl;//第二种方式,like 数组Student stu2 = {"John", 18, 'M'};cout<<"student2 info: "<<endl;cout<<"+name: "<<stu1.name<<endl;cout<<"+age: "<<stu1.age<<endl;cout<<"+gender: "<<stu1.gender<<endl;
}

上图可以看到用"结构体变量.结构体成员"的方式来访问结构体成员;

(2) 用指针访问结构体成员

 Student *pStu = &stu2;cout<<"get struct info with pointer: "<<endl;cout<<"+name:"<<pStu->name<<endl;cout<<"+age:"<<pStu->age<<endl;cout<<"+gender:"<<pStu->gender<<endl;

五,传值,传址,传引用

(1) 传值

默认情况下,参数只能以值传递的方式给函数,也就是说被传递到函数的只是变量的值,不是变量本身.

int main() {int aa = 11, bb = 22;trySwapByValue(aa, bb);cout<<"aa == "<<aa<<", bb == "<<bb<<endl;return 0;
}void trySwapByValue(int a, int b) {int temp = a;b = a;a = temp;
}

aa, bb将自己的值传给函数的参数a, b之后就和aa, bb没关系了.所以trySwapByValue里面再热闹,也跟aa, bb无关

(2) 传地址

int main() {int aa = 11, bb = 22;trySwapByAddress(&aa, &bb);cout<<"aa == "<<aa<<", bb == "<<bb<<endl;return 0;
}void trySwapByAddress(int *a, int *b) {int temp = *b; //将b的地址暂存到temp*b = *a;       //指针b指向a的地址*a = temp;     //指针a指向b的地址
}

输出结果:aa == 22, bb == 11
成功交换了aa和bb

(3) 传引用

int main() {int aa = 11, bb = 22;trySwapByReference(aa, bb);cout<<"aa == "<<aa<<", bb == "<<bb<<endl;return 0;
}//为何称为传引用呢?--可能因为变量名被称为引用?
void trySwapByReference(int &a, int &b) {int temp = b;b = a;a = temp;
}

输出结果:aa == 22, bb == 11
成功交换了aa和bb

六,对象

小demo一个:

#include <iostream>
using namespace std;#define FULL_GAS 81
class Car {public:string color;string engine;unsigned int gas_tank;unsigned int wheel;Car(void);void setColor(string color);void setEngine(string engine);void setWheel(unsigned int w);void fillTank(int liter);int running(void);void warning(void);
};//constructor
Car::Car(void) {color = "Red";engine = "V8";wheel = 4;gas_tank = FULL_GAS;
}void Car::setColor(string col) {color = col;
}void Car::setEngine(string eng) {engine = eng;
}void Car::setWheel(unsigned int w) {wheel = w;
}void Car::fillTank(int liter) {gas_tank += liter;
}int Car::running(void) {cout<<"I'm running at a high speed"<<endl;gas_tank--;cout<<"gas left: "<<100*gas_tank/FULL_GAS<<"%"<<endl;return gas_tank;
}void Car::warning(void) {cout<<"WARNING!"<<endl;cout<<100*gas_tank/FULL_GAS<<"% oil in tank"<<endl;
}int main() {char i;Car mCar;mCar.setColor("Yellow");mCar.setEngine("V8");mCar.setWheel(4);mCar.gas_tank = FULL_GAS;while(mCar.running()) {if(mCar.running() < 10) {mCar.warning();cout<<"Need to add oil?(Y/N)"<<endl;cin>>i;if('Y' == i || 'y' == i){mCar.fillTank(FULL_GAS);}}}return 0;
}

朝花夕拾--C++再学习相关推荐

  1. C语言再学习--关键字

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/53021879 C语言一共有32个关键字,如下表所示: 关键字 说明 auto ...

  2. C语言再学习 -- 创建excel文件

    参看:C语言操作Excel表格 上一篇文章讲了一下 cJSON,可以生成json文件了.这篇文章讲一下怎么生成excel表xsl格式文件. 注意点: 1.文件类型为 xls 或者 xlsx 2.使用f ...

  3. RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78214267 既然已经可以通过 RTSP 获取h264 裸流了.那么通过 F ...

  4. RTSP再学习 -- Hi3516A RTSP实例 分析

    上一篇文章,讲到了Hi3516A通过RTSP播放H.265视频流的源码.接下来对源码分析一下. 这里推荐一个工具,参看:日常生活小技巧 -- 文件对比工具 Beyond Compare (1)首先从 ...

  5. LIVE555再学习 -- FFmpeg + live555实现RTSP直播

    一.简单实验 首先先简单的实验了一下. 运行 FFmpeg 将 MP4文件转成 264 文件 ffmpeg -i Tai.mp4 test.264 执行 testOnDemandRTSPServer ...

  6. LIVE555再学习 -- testOnDemandRTSPServer 源码分析

    一.简介 先看一下官网上的介绍: testOnDemandRTSPServercreates a RTSP server that can stream, via RTP unicast, from ...

  7. LIVE555再学习 -- testH264VideoStreamer 源码分析

    上一篇文章我们已经讲了一部分: testH264VideoStreamer 重复从 H.264 基本流视频文件(名为"test.264")中读取,并使用 RTP 多播进行流式传输. ...

  8. LIVE555再学习 -- testRTSPClient 实例

    上一篇文章简单看了一遍 testRTSPClient  的源码,接下来举几个应用实例加深一下. 首先什么都不做修改,先执行一遍,看一下. 一.执行 testRTSPClient 特么,上面的东西我没看 ...

  9. LIVE555再学习 -- DM368/Hi3516A 交叉编译

    接着上篇文章来讲,参看:LIVE555再学习 -- Linux 下编译 下载源码.文件介绍部分不再介绍.主要看配置编译部分. 三.配置编译 DM368 的交叉编译器为 arm-none-linux-g ...

  10. MQTT再学习 -- 交叉编译与移植

    先说明一下,遇到的问题.我之前在 Ubuntu12.04 gcc 下可以搭建 mqtt 服务器生成的 libmosquitto.so.1. 参看:MQTT再学习 -- 搭建MQTT服务器及测试 现在我 ...

最新文章

  1. 二叉排序树(c/c++)
  2. docker安装mysql及相关配置、运行细节和常见报错解决方案
  3. 十、 RDD编程和Spark SQL
  4. objectC时间用法
  5. Caught FileNotFoundError in DataLoader worker process 0
  6. 【统计学笔记】方差分析表和回归分析表的解读
  7. bootstrap制作一个优美的导航栏
  8. 获取iOS设备唯一标识 uuid
  9. 软件配置一套键鼠控制两台电脑
  10. 微信会员卡管理系统会员充值说明
  11. 关于 Kubernetes中Service的一些笔记
  12. Linux下如何创建和取消软连接
  13. rtl8723bs linux网卡驱动识别问题,无法使用无线的解决方法
  14. OOV问题-论文笔记《Neural Machine Translation of Rare Words with Subwords Units》- ACL2016
  15. 码云+idea(代码托管)
  16. 谁是古代最风流的首席娱乐官?
  17. 输入法的好帮手——IMETOOL
  18. zadig提取驱动地址以及cmd命令行运行驱动命令
  19. 阿赵的MaxScript学习笔记分享五《UI组件使用篇》
  20. JAVA输入1~7输出星期一~星期日

热门文章

  1. 批处理之 for /f 中的delims和tokens
  2. $.ajax datatype默认是什么类型,ajax的dataType有哪些类型?
  3. 计算机补码运算公式,计算机中的补码
  4. Qt内置图标演示Demo
  5. Android所有小部件列表页面,伟大的Android时钟小部件列表,以帮助您了解时间 | MOS86...
  6. 【无标题】cmd命令窗口显示‘npm‘ 不是内部或外部命令
  7. Python库安装失败解决办法
  8. 鸿蒙系统对国产软件的影响,鸿蒙2.0开启公测,国产软件集体上涨,华为成为国产带货一哥...
  9. 【Hadoop】27-Hadoop的计数器
  10. 【在韩求职 #1】简历如何写?写简历的秘诀?이력서 작성하기 꿀팁!!