杂项-tar/grep/find/test命令,strlen和sizeof的区别,引用和指针的区别,值传递/指针传递/引用传递的区别

好记性不如烂笔头,之前从事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

得出的结论 引用传递是把变量本身传递,在被调函数中若修改了变量的值,则调用函数中变量的值也会修改

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值