本文共 1764 字,大约阅读时间需要 5 分钟。
分析下列输出:
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’
为终止。
本质上讲,所有数组在内存中都是一维线性的,只不过不同的语言可能存储方式不同,有行优先存储和列存储。
以下声明是否正确:
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数组的第一个元素。
还有要注意二维数组的某一元素的随机读取:
注意,当动态声明数组的时候,数组相当于一个链表,因为数组的a[k]都是一个int*,所以动态申请的二维数组的元素不是连续的,所以我才说相当于一个链表。
在宏定义中,经常会看到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
详解:http://c.biancheng.net/view/779.html
find用来搜索文件,可以按照:权限、文件名、文件大小、文件时间、inode号、所有者等来搜索文件。
但是find是直接在硬盘中进行搜索的,如果指定范围过大,就会消耗较大的系统资源可能导致服务器压力过大。
命令格式:
[root@localhost ~]# find 搜索路径 [选项] 搜索内容
find有两个参数:
选项如下: