好记性不如烂笔头,之前从事C的工作,在写服务器与数据库相关的东西。换了份工作后,用C++ 做偏上层的东西,发现之前学到的C和数据库知识已经很模糊了。因此我想把这些知识点都记下。温故而知新。都是一些零碎的东西,有的是不经常用容易忘的,有的是不理解容易忘的,这里慢慢积累。
Linux 命令相关:
tar命令
-c 建立新的包
-v 显示执行过程
-f 指定包的名称
-x 解包
-t 显示包的内容
.tar
解包:tar xvf FileName.tar
将指定文件从包中拿出来: tar xvf FileName.tar filename
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!如果是带路径压缩,解压的时候会按路径解压)
———————————————
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
———————————————
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2 或tar –bzip xvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
———————————————
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
———————————————
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
———————————————
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
压缩一个目录使用 -r 参数,-r 递归。例: $ zip -r FileName.zip DirName
———————————————
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName
grep 命令
-c:只输出匹配行的计数。
-n:显示匹配行及 行号。
-v:显示不包含匹配文本的所有行。
用法举例
grep -c "printf" * 当前目录下所有文件中包含printf的行号
find 命令
find . -name "*.c" 当前目录下以.c结尾的文件会递归查找子目录
常配合 | xargs 命令使用 表示把找到的每一条结果进行处理,比如找到a.c b.c 然后对两文件分别处理。如果不加这个命令 则会把 "a.c b.c"当成输入进行处理
SHELL相关
test
-d 文件存在且为目录文件
-f 文件存在且为普通文件
-r 文件存在且为可读文件
-w 文件存在且为可写文件
-x 文件存在且为可执行文件
-s 文件存在且长度非0
test 命令可简写成 [ -d filename ] 前后要有空格否则报错
shell里$1表示命令行输入的第一个参数
C相关
int a[10]
a为地址 *a为数组第一个元素的值
*a+1为第一个元素+1 *(a+1)为第二个元素
sizeof(a)=40 数组的长度 sizeof(*a)=4 一个元素类型所占的长度
&a和a的值相同 &a表示整个数组的地址 a表示数组首地址
&a+1向后移整个数组的长度 a+1向后移单个元素所占的长度
strlen和sizeof的区别
sizeof是操作符 strlen是函数
sizeof参数多样可以是 类型 变量 函数等 strlen参数只能是char * 他只能测字符串中有几个元素
malloc calloc realloc
malloc(size_t size) 分配指定字节数的存储区
calloc(size_t mobj,size_t size)给指定长度的对象,分配能容纳其指定个数的存储空间
realloc(void *ptr,size_t newsize)若ptr是一个空指针,功能与malloc相同,他本身的作用是更改现有存储区的长度
三个函数成功都返回非空指针,出错返回NULL。
C++相关
引用和指针的区别
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已
(2)可以有const指针,但是没有const引用;
(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
(7)指针和引用的自增(++)运算意义不一样;
值传递,指针传递,引用传递
值传递
void test();
main ()
{
int p = 3;
test(p);
printf("p is %d\n",p);
}
void test(int q)
{
q = 1;
printf("q is %d\n",q);
}
结果为1,3
得出结论为值传递时 传递的是变量的一份拷贝,在被调函数中若修改了变量的值,在调用函数中变量的值并不会修改
指针传递
#include<stdio.h>
void test();
main ()
{
int a = 3;
int *p =&a;
printf("p is %p\n *p is %d\n",p,*p);
test(p);
printf("p is %p\n *p is %d\n",p,*p);
}
void test(int *q)
{
int b = 1;
q = &b;
printf("q is %p\n *q is %d\n",q,*q);
}
结果为
p is 0x7fff6f202394
*p is 3
q is 0x7fff6f202374
*q is 1
p is 0x7fff6f202394
*p is 3
得出结论指针传递的时候,相当于值传递,传递的也是指针变量的一份拷贝,在被调函数中若修改了变量的值,在调用函数中变量的值并不会修改
指针传递的另一种情况
#include<stdio.h>
void test();
main ()
{
int a = 3;
int *p = &a;
printf("p is %p\n *p is %d\n",p,*p);
printf("&p is %p \n p is %p\n",&p,*(&p));
test(&p);
printf("p is %p\n *p is %d\n",p,*p);
}
void test(int **q)
{
printf("q is %p \n*q is %p\n",q,*q);
int a=1;
*q = &a;
printf("q is %p \n*q is %p\n",q,*q);
}
结果为
p is 0x7fff9d7c38a4
*p is 3
&p is 0x7fff9d7c38a8
p is 0x7fff9d7c38a4
q is 0x7fff9d7c38a8
*q is 0x7fff9d7c38a4
q is 0x7fff9d7c38a8
*q is 0x7fff9d7c388c
p is 0x7fff9d7c388c
*p is 1
得出的结论 传递指针要想修改调用函数中的指针变量的值,要把指向指针的指针当做实参传递,而且被调函数的形参也要写成二级指针形式,否则会出现类型错误
引用传递
#include<iostream>
using namespace std;
void test(int &);
main ()
{
int a = 3;
cout<<a<<endl;
test(a);
cout<<a<<endl;
}
void test(int &q)
{
int b = 1;
q = b;
cout<<q<<endl;
}
结果为 3 1 1
得出的结论 引用传递是把变量本身传递,在被调函数中若修改了变量的值,则调用函数中变量的值也会修改