【转行学习日记01】c/c++语言基础笔记和自我理解

感觉学习c++很像在造房子,搞城市规划,程序就是一个小区 函数就是其中一个功能模块
**一. int * p//代表p是一个指针 ,变量p的类型是 int ***

举个例子 : int * p =(int *) 40000; //这个其实很简单两者相等的意义就是 类型并且数值相等
这个指针的赋值 只能通过强制括号执行 因为40000本身是一个常数 并不代表地址 而加入了强制就使得
这里就代表了p指向地址40000 而地址p就是地址40000
那么这里出现了一个 p 这个代表了地址40000开始处若干个字节的内容
懂了 ,p是一把钥匙 钥匙上写的40000,但钥匙本身没有放在40000里面 在库房里面
p 就是说你可以通过给40000这个房子里面存点东西
而int n = *p 是说 ,把这个p指向的房子里面东西给你复制一篇到n 里面

所以 T* p; // T可以是任意类型的名字
p 的类型 是 T* // p是一把钥匙 但p的值为40000
*p 的类型 是 : T //*p 打开了 p所指向的的门 是门里面的东西 是T类型的变量
通过表达式 *p 我们可以读写从地址p开始的 size of (T)个字节

  • 又叫做间接引用运算符 一般不会说就确定40000了,因为你还不知道40000里面住没有住人

举个例子
char ch1= ‘A’;
char * pc =& ch1;// &是取地址运算符 这是因为char 类型是地址类型 所以
现在pc这把钥匙 是指向了ch1所代表的内存空间 ,而
p就打开了这个空间的门
&x的类型就应该为T *
指针这把钥匙太神奇了 ,以前 我只能通过访问变量 访问内存空间
现在我可以直接想去哪个空间去哪个,我还可以访问变量前面后面的房子

指针就相当于能跑去暗房一个万能钥匙啊 ,对社会不是很和谐 ,但是确实很出格 很nb

不同类型的指针,如果不经过强制类型的转换 就不能够直接互相赋值

比如 int * pn ,char * pc ;
pn = pc ;//这个就不行 ,开不了门 因为房间大小不一样 这就导致了钥匙不相互匹配
并且也不能随意改动,特别是char 向int转化 因为char只有一个字节 ,int有四个就会强制占领后面的3个字节
你也不清楚后面3个装了啥就可能会报错

两个同类型的指针变量 可以比较大小
还可以相减: 相减的意义就是判断两个地址中间还有可以放多少个该类型的变量
指针变量加减一个整数 也是指针 这个不是 可能会出错
还可以自增自减少 ,但是加减一次就是变化该类型变量那么多
p是一个T*类型的指针则 p[n] == *(p+n)

空指针 地址0不能够访问 指向地址0的指针就是空指针
可以用NULL代替 可以任何变量 就是表达空指针

数组的名字就是一个指针啊
例如 int a[10] ,那么a的类型就 int * ,就是指向数组的起始地址 但是这时候a的值就不能够再改变;
当作为函数形参时 ,T* p和T p[]是等价的

而.字符串和指针
字符串常量和字符数组名的类型也是 char *
char * p =“Please input your name : \n”;
cout << p; //这说明p就是地址 ,是这个字符串的起始地址
再看 
char name[20];
char * pName = name;
cin >> pName ;
cout << " Your name is " << pName;
name也是代表一个地址 ,
这在里我把字符串库函数省略了,因为不是会很需要,有需要再去查找

void指针
可以用任何类型的指针对void指针进行初始化 或者赋值
void * p; p可以取double或者其他都行
*p 没有定义,就是说是一个任意房间或者当作一个帐篷一气球之类的
这个主要用在一些所谓内存操作库函数中,可以设置一些数组值的初始化

函数指针
指向函数的指针变量 例如 int (*pf) (int ,char);
这个说明该函数的返回值为int类型的,而参数分别为int 和char 类型的
这个其实有点想可以用在复合函数这种类型里面

三.构和变量
1.结构 struct
结构是为了让程序员自己造房子,小别墅,可以定义新的数据类型
struct 结构名

类型名 成员变量名;
。。。。。。

例如 struct Student{
int ID;
char szName[20];
float GPA;}
这个时候 Student就变成了自定义类型了,类似char 这种,可以 Student s1;
注意两个类型相同的结构变量可以互相赋值 ,但是不能够这样比较运算
一般来说结构变量所占空间大小就是结构中所有成员的大小之和
可以通过 Student. ID这种来访问成员变量
结构变量的赋值可以定义的时候就进行初始化利用{}就可以了
还可以定义结构数组 参考 int这种就行
关于访问结构变量的指针,如果p是指针那么 p->ID和(*p).ID是等价的 当然指针得和该结构类型相同

四.关于全局变量和局部变量
定义在函数内部的变量叫做局部变量,比如函数的形参
定义在所有函数外面的变量叫全局变量
静态变量就是 全局变量都是静态变量,局部变量定义前面加了 static 也成为

关键就是静态变量的存放地址在整个程序运行期间都是固定不变的
静态变量只初始化一次,所以如果是局部变量,那么在第二次运行的时候就不会运行那一句定义了

五.变量的作用域和生存期

变量名,函数名,类型名统称为“标识符”。一个标识符能够起作用的范围,叫做该标识符的作用域
在单文件的程序中,结构,函数和全局变量的作用域是其定义所在的整个文件夹
函数形参的作用域是整个函数 局部变量的作用域,是从定义它的语句开始,到包含它的最内层的那一队大括号
同名标识符是在谁那里谁起作用

变量的生存期 ,这个变量的内存空间只能被它自己所使用 ,全局变量是一直生存
静态局部变量的生存期从定义它语句的第一句被执行到程序结束为止
函数形参的生存期从函数被执行开始,到函数返回时结束 ,
非静态局部变量的生存期,从执行到定义它的语句开始一旦程序执行到了它的作用域之外,生存期终止

六.程序或算法的时间复杂度

一个程序或者算法的时间效率,也称为时间复杂度,有时简称复杂度
复杂度常用大写字母O和小写字母n表示,n代表问题的规模
时间复杂度是用在算法运行过程中的,某舟时间固定的操作需要被执行的次数和n的关系来度量的。在无序数列中查找
某个数,复杂度是O(n).
计算复杂度的时候,只统计执行次数最多的(n足够大时)那种固定操作的次数
比如某个算法需要执行加法n平方次,除法n次,那么就记其复杂度是n平方次
常用复杂度有 0(1)常数复杂度 时间(操作次数)和问题的规模是无关的
0(log(n)) 0(n)线性复杂度 0(n的k次方)多项式的复杂度
指数复杂度和阶乘复杂度

举几个例子:
·在无序序列 中查找某个数(顺序查找) 0(n)
求出任意两点之间的距离在n个点中 0(n方)
插入排序,选择排序,冒泡排序 0(n方)
快速排序 0(n*log (n))
二分排序 0(log(n)) 从0到1000找一个数 ,不断用2分法,只需要十次计算 log1000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值