博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每日一练(十七)
阅读量:3949 次
发布时间:2019-05-24

本文共 4901 字,大约阅读时间需要 16 分钟。

文章目录

11.16 Linux 数字权限使用

Linux中对文件的权限有严格的控制,想要对某个文件进行相关的操作时,要有相应的权限才可以。

一般权限包括:读r、写w、执行x

Linux权限的使用者分类有三种:

  • u:文件拥有用户
  • g:同一组的用户
  • o:其他组的用户

如果其他组的用户想要拥有对文件进行某一操作的权限,可以将该用户加入具备权限的组,所以一个用户可以同时归属多个组。一般使用chmod命令来对文件的权限进行修改设置。

权限可以用相应的数字来表示,数字4、2、1分别代表读、写、执行权限,所以对文件的权限描述可以通过4、2、1三个数字的相加来表示(三个数字的组合都是唯一的)7=4+2+1 6=4+2 5=4+1 3=2+1

而且一个文件的权限是针对三个

比如:

chmod 700 test.c   #-rwx------ u:读、写、执行  g:无权限  o: 无权限   chmod 740 test.c   #-rwxr----- u:读、写、执行  g:只读  o: 无权限  chmod 761 test.c   #-rwxrw---x u:读、写、执行  g:读、写  o: 只执行

常见权限形式:

-rw------- (600)      #只有拥有者有读写权限。-rw-r--r-- (644)      #只有拥有者有读写权限;而属组用户和其他用户只有读权限。-rwx------ (700)      #只有拥有者有读、写、执行权限。-rwxr-xr-x (755)      #拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。-rwx--x--x (711)      #拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。-rw-rw-rw- (666)      #所有用户都有文件读、写权限。-rwxrwxrwx (777)      #所有用户都有读、写、执行权限。

11.17 二维数组的指针运算

int a [ 5 ] [ 4 ], ( * p)[4]=a;,数组a的首地址为100,* (p+2)+3等于 ( )

  • A 116
  • B 118
  • C 144
  • D 122

答案是:C

对于int a[5][4],a相当于一个二级指针,a是一个指针数组,数组中的每一个元素a[0] a[1] a[2]都是指针;a[0]是一个指向数组的指针,数组中有4个int数据。

对于int (*p)[4]=a,p是一个指针数组,数组中有4个int数据,即p和a在指向的对象上是一致的,然后p=a,a的首地址为100,代表b中存储的值就是100。

*(p + 2)相当于a[2],还是一个指针,相对于a来讲移动了8个int的内存地址,然后又*(p + 2) + 3,又相当于移动了3个int的内存地址,所以一共移动了11个int的内存地址,即44Byte,所以*(p + 2) + 3的值为144,本质上还是地址。

11.18 Make file 变量

makefile中变量分为三种:

  • 用户自定义变量
  • 预定义变量
  • 自动变量

自定义变量的定义和引用

变量是用来代替如下类型的文本字符串:

  • 系列文件的名字
  • 传递给编译器的参数
  • 需要一些的程序
  • 需要查找源代码的目录
  • 需要输出信息的其他目录
  • 其他事情

定义变量的方法为:

  • 递归展开:VAR=var
  • 简单扩展:VAR :=var

要注意的是:递归展开在展开的时候可以将内嵌的变量全部展开,但是如果在变量后面追加内容,可能在扩展的过程中导致无穷循环。所以一般情况下使用简单扩展比较好。

变量的使用:

于shell中一样,要引用变量的值,需要符号$,以$(VAR)的形式来引用变量,只有在变量定义的时候不需要$,引用变量相当于C语言中的宏定义。

若要表示$本身,则$$即可

例如:

OBJ = main.o hello.o bye.oCC = gccCFLAGES = -Wall -O -gcreate: $(OBJ)        $(CC) $(CFLAGES) $(OBJ) -o a.outmain.o: main.c        $(CC) $(CFLAGES) -c main.c -o main.ohello.o: hello.c        $(CC) $(CFLAGES) -c hello.c -o hello.obye.o: bye.c        $(CC) $(CFLAGES) -c bye.c -o bye.oclean:        rm *.o

变量在定义的时候,直接=即可,变量在引用的时候必须加上$

可以通过+=运算为变量添加新的值

预定义变量

在这里插入图片描述

在这里插入图片描述

自动变量

在这里插入图片描述

修改后的Makefile如下:

OBJ  := main.o hello.o bye.oCC  := gccCFLAGES := -Wall -O -gcreate: $(OBJ)        $(CC) $(CFLAGES) $(OBJ) -o a.outmain.o: main.c        $(CC) $(CFLAGES) -c $< -o $@hello.o: hello.c        $(CC) $(CFLAGES) -c $< -o $@bye.o: bye.c        $(CC) $(CFLAGES) -c $< -o $@clean:        rm *.o

环境变量

在这里插入图片描述

11.19 Linux修改主机名

有时Linux中的主机名太长了,搞得我们命令行都不好看,所以可以通过命令行来修改主机名。

查看主机信息

通过hostnamectl来产看主机的信息:

在这里插入图片描述

修改主机名称

还是通过hostnamectl命令来修改主机名,可以通过man hostnamectl来查看有关的命令:

在这里插入图片描述

通过如下命令即可修改主机名:

hostnamectl set-hostname 

参考:https://linux.cn/article-10651-1.html

11.20 顺序表的创建、删除、插入、查找

创建顺序表

对于线性表的创建,要注意以下几点:

  • 线性表内存的分配,这里采用动态内存分配malloc
  • 使用malloc的时候记得要检查申请空间是否成功
  • 顺序表的初始化,采用memset()进行整个顺序表的初始化,因为malloc申请的空间是不会自动初始化的,所以先统一初始化一下
  • 然后对顺序表中单独的有特殊需求的成员初始化,比如上面将顺序表元素都初始化为0,还要单独对last初始化为-1
  • 要注意sqlist于sqlink的区别,sizeof(sqlist)是顺序表的大小,sizeof(sqlink)是指针的大小4Byte

代码如下:

#include 
#include
#include
#include "sqlist.h"sqlink link_create(void){
sqlink L = (sqlink)malloc(sizeof(sqlist)); if (L == NULL) {
puts("err!"); return NULL; } memset(L, 0, sizeof(sqlist)); L->last = -1; return L;}

插入元素

对于线性表的插入,要明确插入的位置以及插入的数据,插入元素的主要步骤如下:

  • 先检查线性表是否满了
  • 再检查位置是否合法 [0, last+1]
  • 移动线性表元素
  • 更新插入位置的元素,同时last计数++

验证插入函数的时候,在特殊位置也要验证,比如两侧、中间、越界。

还有,last表示顺序表中最后一个元素的下标,所以是从零开始。

代码如下:

int link_insert(sqlink L, data_t val, int post){
int i; if (L == NULL) {
puts("sqlink L is NULL!"); return 0; } if (L->last == N-1) {
puts("sqlink is full!"); return 0; } if (post < 0 || post > L->last) {
puts("insert post is err!"); return 0; } for (i = L->last; i >= post; i--) {
L->data[i + 1] = L->data[i]; } L->data[post] = val; L->last++; return 1;}

查找元素

查找元素就是遍历顺序表,找出第一个符合条件的元素的位置,返回,代码如下:

int link_insert(sqlink L, data_t val, int post){
int i; printf("%d\n", L->last); if (L == NULL) {
puts("sqlink L is NULL!"); return 0; } if (L->last == N-1) {
puts("sqlink is full!"); return 0; } if (post < 0 || post > L->last) {
puts("insert post is err!"); return 0; } for (i = L->last; i >= post; i--) {
L->data[i + 1] = L->data[i]; } L->data[post] = val; L->last++; return 1;}

删除元素

要注意,删除的时候同样也要对范围进行检查,从后向前移动,最后还要更新位置。

代码如下:

int link_delete(sqlink L, int post){
int i; if (L == NULL) {
puts("sqlink is NULL!"); return 0; } if (post < 0 || post > L->last) {
puts("post is err!"); return 0; } for (i = post; i < L->last; i++) {
L->data[i] = L->data[i + 1]; } L->last--; return 1;}

转载地址:http://ptwzi.baihongyu.com/

你可能感兴趣的文章
1030 完美数列 (25 分)
查看>>
1031 查验身份证 (15 分)
查看>>
1032 挖掘机技术哪家强 (20 分)
查看>>
1033 旧键盘打字 (20 分)
查看>>
Longest k-Good Segment CodeForces - 616D ( 尺取法)
查看>>
二叉搜索树的实现(BST)(插入+删除+查找+各种遍历+高度)
查看>>
今夕何夕 HDU - 6112 ( 模拟 )
查看>>
Dividing HDU - 1059 ( 多重背包 - 二进制简化 )
查看>>
Robberies HDU - 2955 ( 0-1背包 )
查看>>
FATE HDU - 2459 ( 二维完全背包 )
查看>>
B. Working out CodeForces - 429B (动态规划)
查看>>
10635 - Prince and Princess UVA-10635 (最长公共子序列的O(nlogn)的解法:LCS转换为LIS)
查看>>
Sizeof和Strlen
查看>>
lower_bound和upper_bound
查看>>
Subsequence POJ - 3061 ( 尺取法 )
查看>>
find the safest road HDU - 1596 (迪杰斯特拉dijkstra)
查看>>
关于读入多组测试样例的结束while(scanf()!=EOF)
查看>>
Cure HDU - 5879 (打表预处理)
查看>>
常见HTTP状态码大全
查看>>
Java大数 - 大整数BigInteger
查看>>