每日一练(三十)
1.21 字符串数组问题
分析下列输出:
char a[] = {'a', 'b', 'c'};
cout << strlen(a) << endl;
返回的结果不可预料,因为a初始化的时候,结尾没有主动加上‘\0’
结束符。而标准库字符串处理函数的时候是以结束符\0为结束的。
同理,如下的程序输出:
char a[] = {'a', 'b', '\0', 'c', 'd', '\0'};
printf("%s", a);
输出的就是:ab了,因为字符串处理以‘\0’
为终止。
1.22 二维数组注意事项
本质上讲,所有数组在内存中都是一维线性的,只不过不同的语言可能存储方式不同,有行优先存储和列存储。
以下声明是否正确:
int fun(int a[][]);
看起来没什么问题,问题就出在二维数组的声明上,二维数组的声明初始化不能省略列数!!!
还有一些细节!!!!
int a[3][2] = {(0, 1), (2, 3), (4, 5)};
int *p = a[0];
cout << p[0] << endl;
答案输出:1
猛的一看,认为p[0]=0。
实际上,这里的(0, 1)是逗号运算符,所以int a[3][2] = {1, 3, 5}
,p指针指向二维数组的首地址,p[0]
相当于*(p+0)
,即a数组的第一个元素。
还有要注意二维数组的某一元素的随机读取:
1.23 二维数组的动态声明
注意,当动态声明数组的时候,数组相当于一个链表,因为数组的a[k]都是一个int*,所以动态申请的二维数组的元素不是连续的,所以我才说相当于一个链表。
1.24 宏定义中 do{ }while(0)
在宏定义中,经常会看到do{ } while (0)定义的形式,比如:
#define __set_task_state(tsk, state_value) \
do { (tsk)->state = (state_value); } while (0)
看起来多此一举,可实际上采用do{}while(0)的形式保证了宏定义不会受到大括号、分号的影响,使宏定义总是按照你期望的方式运行。
其中,do{}保证了裸机能够被看作一个整体执行,while(0)保证了只执行一次。
参考:https://www.cnblogs.com/lanxuezaipiao/p/3535626.html
1.25 find 命令
详解:http://c.biancheng.net/view/779.html
find用来搜索文件,可以按照:权限、文件名、文件大小、文件时间、inode号、所有者等来搜索文件。
但是find是直接在硬盘中进行搜索的,如果指定范围过大,就会消耗较大的系统资源可能导致服务器压力过大。
命令格式:
[root@localhost ~]# find 搜索路径 [选项] 搜索内容
find有两个参数:
- 第一个参数指定搜索路径
- 第二个参数指定搜索内容
选项如下:
- -name: 按照文件名搜索;
- -iname: 按照文件名搜索,不区分文件名大小;
- -inum: 按照 inode 号搜索;
- -size[±]大小:按照指定大小搜索文件;
- -atime [±]时间: 按照文件访问时间搜索;
- -mtime [±]时间: 按照文改时间搜索;
- -ctime [±]时间: 按照文件修改时间搜索;
- -perm 权限模式:査找文件权限刚好等于"权限模式"的文件;
- -perm -权限模式:査找文件权限全部包含"权限模式"的文件;
- -perm +权限模式:査找文件权限包含"权限模式"的任意一个权限的文件;
- -uid 用户 ID:按照用户 ID 査找所有者是指定 ID 的文件;
- -gid 组 ID:按照用户组 ID 査找所属组是指定 ID 的文件;
- -user 用户名:按照用户名査找所有者是指定用户的文件;
- -group 组名:按照组名査找所属组是指定用户组的文件;
- -nouser:査找没有所有者的文件;
- -type d:查找目录;
- -type f:查找普通文件;
- -type l:查找软链接文件;
- -a:and逻辑与;
- -o:or逻辑或;
- -not:not逻辑非;