文件权限/属性
前言linux上一个文件添加许多的属性,例如用户组的概念。当我们ls -al的时候,会看到(文件拥有者,用户组,其他人)的读,写,执行权限。 代表意义[权限][链接][拥有者名][用户组名][文件容量][修改日期][文件名] 拥有者,用户组对应相关权限 如果你不是拥有者,用户组,root,那么你就是others 简介 第一个字符是表面这个是文件,目录,链接文件还是设备d->directory(目录)-->文件l->链接文件(类似于windows的快捷方式)b->区块设备文件c->字符设备文件 剩下的字符以三个为一组它们有各自的身份。(文件拥有者,用户组,其他人) rwx这三个字符分别代表read,write,execute的权限 另外还有一个root身份,可以不受系统权限所限制。 修改属性和权限 -R如果要修改目录中的子目录和文件,只要在选项中加上-R chgrp-> change group,修改文件所属的用户组。(chgrp )users是用户组名,只有当此用户组名,列入...
链表和数组
前言链表就是指动态分配结构的序列链 说明我们知道,数组是被分配的连续的内存块,可以轻易调用其中的项,但是要增加和删除其中的项却很困难。而链表呢,因为它是靠结构中的指针将散乱的内存块,串起来。就变得增加,删除其中的项很容易,要访问其中的某一项却很困难。 构造链表的一般步骤(prev是一个结构指针,表示前一个结构的中介)(current是一个结构指针,表示当前结构的中介) while循环(人为结束) malloc分配结构空间,并返回指针给current(结构将在循环中创建) if-else 给prev的next赋值 将本结构的next = NULL 对本结构的内容赋值 让prev = current的指针 关于结构指针 struct Node...
二进制与字符串的转换
前言二进制是一个值01010101,而字符串是一些字符后面加上’\0’,”01010101”.当我们要将这两种形式进行转换的时候,可以运用位运算符,和某两个算法解决。 字符串——>数值 先将数值变量向左移动,再用*取出字符串中的字符,-‘0’转换成数值,添加到变量中。 1234567891011int btoi(char * st){ int num = 0; while (*st)//到空字符结束,8个数,循环8次 { num = (num << 1);//左移动 num += (*st++ - '0');//从左往右取字符,并转换成数值,添加到num } return num;} 数值——>字符串 传递给函数,数值,和要准备存储的字符数组。 取最后一位数(运用8进制的掩码操作01 & num),并将其转换成字符,+...
程序崩溃的可能原因
程序的崩溃的可能由于: 擦拭调程序的代码(把赋值给野指针) 内存越界数组下标越界和指针移动越界 参数错误 12printf("%s %s's grade is %lf %lf %lf and your average is %lf\n", p[i].grade[0], p[i].grade[1], p[i].grade[2], p[i].average); 函数栈溢出 读取未赋值的变量
复杂的声明(指针)
int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针 int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组 int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针 int **p; //首先从P 开始,先与*结合,说是P...
排错方法
debug 注释部分代码 提取部分代码测试
函数和指针
前言首先,了解两个不同的概念。 函数指针这是个指针。它指向函数的地址。 指针函数这是个函数。它用来返回指针。 声明函数指针指针有它所对应的类型,比如int*,int类型的指针。所以函数指针也有其类型。我们又知道,要将一个地址赋给一个指针,它们对应的类型要相同。 首先,函数的声明有两要素。(1)函数的返回值 (2)函数接收的参数的类型 如果有一个函数指针和一个函数,它们各自的两要素一样,这就可以让这个函数的地址赋给这个函数指针。 例如**声明函数指针时只需把(*pf)这个指针和ToUpper这个函数名换掉 函数声明:void ToUpper(char *);函数指针的声明:void (*pf)(char *); **这样一来,(*pf)当作ToUpper 注意 这里必须要将*pf用()括起来。如果不,就成了指针函数了。 在以后调用函数也要()括起来 使用 首先,我们要知道函数的地址怎么表示。数组就把数组名作为它的首元素地址。函数代码就把函数名作为函数起始处的地址。 赋函数地址给指针pf =...
流
前言流,就类似于流水。从一个地方到另一个地方。文件流,数据流。它们是文件/数据源与内存之间的传递。 文件流当我们打开文件时,磁盘里的文件会复制到内存中。为什么,要传递给内存呢?因为它读写数据更快。而内存中有个FILE的结构体变量,它用来保存这些信息。当我们关闭文件时,这些信息就会从这个变量中释放。 输入流文件从磁盘中复制到内存的过程 输出流从内存保存文件到磁盘的过程 数据流数据源就是包括文件,网络,键盘等。 输入流数据从数据源——>内存 输出流数据从内存——>数据源 I/Oinput output程序在内存中,通过程序与外部设备(磁盘,键盘,其他计算机)进行交互的操作。
数组与结构
初始化结构与数组的初始化都要用 {}例如: 123456789101112131415struct name { char first_name[LEN]; char last_name[LEN];};struct student {//结构 struct name names;//结构 float grade[NUM];//数组 float average;};struct student score[CSIZE] = { {{"Zha", "Yujie"}, {0, 0, 0}, 0}, {{"Jiang", "Wenjie"}, {0, 0, 0}, 0}, {{"Liu", "Chengming"},...
错误collect2:ld returned 1 exit status
前言我们遇到这种错误的时候,大多是因为编译器的位数为32位,编译时使用double类型就会发生这样的错误,或者编译过慢。 方法更换成64位的编译器就可以了。
