数据结构day2
数据结构day2
条件与循环
1.if..else..
if(条件(bool)){
}else{
}
if(A){
B;
}else{
C;
}
D;
我们进入B还是进入C依赖于最开始A的结果,无论里面对A进行什么样的操作
2.for语句

比较基础,看看就行,当最后执行完i++后,会再去进行判断i是否小于4,而不是直接跳出去执行E
地址与指针
3.内存
内存是由一个一个的单元组成的,日常计算机中,计算机都是以字节编址的,一个单元即为一个字节即为B英文(Byte)
而计算机是二进制的,一位二进制可以表达为0or1 即为b英文 Bit
一个单位下可以放下【10010001】也就是8位的二进制位
因此一个字节=8位二进制位
4.地址
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
8 | |||||||
我们把内存的每一个单元格从0开始标上序号,每个单元格都有属于它自己的序号,这个序号就是当前单元格的地址
因此单元的地址多少与单元的内容无关,而与它是存储器中第几个单元有关
5.单位量级
常识,直接看表格
单位 | 量级 | 单位 | 量级 |
---|---|---|---|
T | 2^40 或10^12 | ||
G | 2^30 或10^9 | ||
M | 2^20 或10^6 | ||
k | 10^3 | K | 2^10 (1024) |
本身 | 1 | ||
m | 10^-3 | ||
u | 10^-6 | ||
n | 10^-9 | ||
p | 10^-12 | ||
f | 10^-15 |
6.申请内存
int a=0
这行代码申明了一个int类型,那么在运行的时候,进程就会在内存中为变量a申请到一个足够放下int的空间
int的数据范围是-2^31 到 2^31-1 ,一共是2^32 个数字,需要32个二进制位,也就是32b=4B
因此一个int需要4B的内存
下面是c艹的数据类型使用内存列表
数据类型 | 空间 |
---|---|
char | 1B |
short | 2B |
int | 4B |
float | 4B |
double | 8B |
7.取址符&
#include <iostream>
using namespace std;
int main(){
int a=10;
cout<< &a << endl;
}
在元素前加入&,就可以输出当前它所在的内存的位置
8.首址
假如我们一个int占用了 4/5/6/7 这四个单元,那么这个int的地址为4
我们用取址符输出的皆取它最小的那个值,作为首地址
9.指针
对于内存空间来说,无论是指令还是数据,都要通过对应单元的地址取访问内存单元中的内容,
但是c/c艹语言将【通过地址摆弄数据】的权力,交给了【程序员】,这是其它高级语言所不具备的,
这个权力就是【指针】或者【指针变量】
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
8 | |||||||
16 | |||||||
24 | |||||||
32 | |||||||
p | p | p | p | ||||
48 | |||||||
56 |
比如说,系统吧4/5/6/7分配给了变量a,它的地址是4
现在我们重新取申请一个变量p,用p去存放a的地址(4),也就是我们将a的地址保存进了另一个变量p中,我们称p为a的指针
这里a的数据类型是int
p的目的是为了存放a的地址,所以
p的数据类型是int*
如果我们要防止一个数据double
那么它的指针的数据类型为double*
10.*
#include <iostream>
using namespace std;
int main(){
int a=10;
int* q=&a;
cout<< &a << endl;
cout<<q<<endl;
cout<< &q << endl;
}
作用1:数据类型*=变量的地址;
int* q=&a;
说明这里的q存放的是a的地址
作用2:解引用
这是最关键的一个作用
#include <iostream>
using namespace std;
int main(){
int a=10;
int* q=&a;
int b=*q;
//等同于(b=a)
}
*指针变量:就能通过这个指针变量里存放的地址访问到对应的变量,
比如说*q在这里可以访问到a
&是通过变量求地址,*是通过地址求变量
&a的结果是q,*q的结果是a
本质上a和q都是变量,没有层次的差别,只是数据类型不一样