======不断更新~~~======
当初作为萌新,有几点耽误了自己。
一是嫌弃太大不用vs,
二是不会调试【f9,f5,f10,f11---其实就这么四个按键】遇到问题只能糊里糊涂、只能打输出费时间,
三是不懂得操作系统原理乱写乱搜
====2019.6.11,今天填写了一些过去空着的问题,感觉很像自己给自己解决作业~发现过去还不太明白的东西在工作中慢慢都接触并明确了,这种感觉还不错~=====
我作为新手时的困难(唉~),所以我本片博客就尽量把这些写清楚。
最希望能有的: 分块注释,关键理解部位注释。
我需要却难找的: 简洁、有效、必要、可运行的代码。
一些坑: 目录结构,配置环境,数据类型转换,不会调试,不会用一些常用库函数,动态数组,常用赋值(初始化)技巧。
一、代码用法、逻辑
——总会有让人看不懂的代码,就像词汇咱都认得,但不明白整句话的意思……
1.if\循环的()里套用函数
比如==1,代表if内的函数已经执行后是否成功,不成功则跳出;重要的是,那个函数已经执行!在if判断时!
#include<stdio.h>
int func()
{
printf("我来自func \n\n");
return 0;
}
int main()
{
if (0 == func())//当返回0的时候,func函数内的操作已经执行完毕了
printf("func返回了0~");
return 0;
}
2.函数内套用函数(包括递归)
把函数当作一种操作,需要实实在在改变参数的值就加个(&)引用,把函数操作当作return的东西来用。
(0)调用函数
比如在高中数学里,我们有y=f(x);f(x)=3x;
在C语言里我们有:
#include<stdio.h>
int f(int a)
{ return 3 * a;}
int main()
{
int y; int x = 7;
y = f(x);
printf("%d", y);
}
(1)函数形参与引用&
#include<stdio.h>
void f(int &a)//注意这里的&
{
a = 3 * a;
}
int main()
{
int x=1;
f(x);
printf("%d", x);//x从1变成了3
}
(2)递归
#include<stdio.h>
void f(int a)//注意这里的&
{
//截止条件
if (a < 0) return;
//本层操作
printf("%d ", a);
//递归机
f(a - 1);//注意这里网下一层传递的是a-1,在变小,不会导致无限递归;
}
int main()
{
f(6);
return 0;
}
3.void型指针(其实就是4字节的,可以随意转化成任意类型的指针)
#include<stdio.h>
void rt_init_thread_entry(void* parameter)
{
printf("%c", parameter);
}
void main()
{
void* asd=(void*)1;
rt_init_thread_entry(asd);
}
4.stack<int> st是什么意思(容器类,数据结构那样的操作,使用起来更方便)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(9);
cout << vec[0] << endl;
return 0;
}
5.打破常用套路:for循环内有多个判断条件\循环内处理
for(单次表达式;条件表达式;末尾循环体){中间循环体;}
for循环里条件需要用“&&”而不是习惯的“,”。而且处理部分也可以放到末尾循环体中。
#include<stdio.h>
int main()
{
int i, j=5;
for (i = 0; i < 10 && j < 20; i++, ++j, printf("\n"))
{
printf("i=%d ", i);
printf("j=%d ", j);
}
return 0;
}
6.new 类的构造函数
结构体只能:new 结构体类型名
类里就可以在括号里放构造函数的参数了~:new 类名(构造函数参数)
二、操作系统、工程配置相关
——脱离操作系统、编译器、工程配置去学习编程语言是不健全的!
这部分是我……“想写”csdn写一篇“算法与工程”,讲大学期间算法牛逼人就厉害,工作当中则是配置环境、生成与调用动态库的问题。”
1. 环境变量
这个问题就涉及到系统如何搜索命令了,
顺序是搜索当前文件夹、搜索系统目录、搜索环境变量目录
2.cmd框里的命令其实就是.exe文件的文件名。(cmd命令)
这个问题其实就是操作系统的使用问题,和环境变量有些关系……
3.linker(链接器)
程序需要走 源代码(预处理、编译出)目标文件(链接出)可执行文件,这一流程。
可见链接器在其中的作用。
4.python的交互编程、脚本编程(关系类似于Linux的shell、shell脚本)
交互编程类似于命令行
脚本编程类似于平时写c++那样,只不过运行时是“边编译处理成中间代码边解释运行“的。
5.堆内存、栈内存(烫烫烫、屯屯屯)
内存的初始化问题
详见我的另一篇博客:https://blog.csdn.net/sinat_27382047/article/details/72810390
6.常用目录结构简称、
等我再单独写一篇把链接发出来
三、编程语言【有些函数不是你想象的那样执行结果】
——想要写好算法,深度了解这些坑的原理是非常必要的!不然总是出现与预期不一样的莫名其妙的错误谁受得了!!
1.C语言里float 3按照int读取,莫名其妙是0.00000(类型转换)
float a=3;
int b=(int)a;
printf("%d",b);
深入到汇编语言你就会了解到,不同类型变量只是读取数据时指针的长短和格式不一样,同一段数据用不动方式qui读当然会不一样
2.memset为什么设置为0的时候才不会出乱码
因为赋值的东西容易被用不同方式去读取,如同上一问。。
注意:memset如果去设置某些带有构造、析构函数的类型的变量会导致函数指针被清零导致寻址错误。
3.sizeof的内存补齐
int 4,int 4,char 1。加一块得7,但是用sizeof得出来是12(下面这段代码运行完输出12,而不是7)
#include<stdio.h>
struct A
{
int a;
int b;
char c;
};
void main()
{
printf("%d", sizeof(struct A));
}
4.typedef与结构体的一种声明成员的区别
https://blog.csdn.net/u013632190/article/details/47720703
5.c、c++ 、extern
6.如何编写socket
6.指针和引用的区别
指针更加灵活:一可以为空,二可以换指其他地址。
7.句柄标记系统资源,指针标记物理内存地址。
8.malloc/free是库函数(不在编译器控制权限之内,不能用于析构和构造任务),new/delete是运算符
9.const 的本质: const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。
10.指针、内存首地址
指针存着一段内存的首地址,用free释放的是那段内存给操作系统,但是指针变量本身不会被删除。
11.大端小端
同样是存储和读取方式不一样
====================最后提醒=================
一定不要忘记初始化变量
new\delete, malloc\free 配套使用
delete\free 之后,要让指针为 null
警惕数组越界
避免野指针