一些科普内容
内容来自 百度百科 以及 维基百科
开源
Linux
GNU
FTP工具
驼峰式大小写
CentOS
IRC
Fedora
Arch Linux
脚本语言
批处理
DOS
Windows操作系统
Mac OS
Windows NT
Solaris
C语言wiki
白帽子
VBScript
代理服务器
格式化
Eclipse
Markdown
Xps viewer
VPN
系统调用wiki
系统调用Baidu
WebKit
C语言学习笔记
const的用法
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:把一個聲明從右往左讀。
比如説:
1.char *const cp;
: cp is a const pointer to char
2.const char *p;
: p is a pointer to const char
#define 的使用
#define
後宏值的替換者最好加上()
,這是一個很好的習慣,以免發生意想不到的錯誤
比如說:
#define __NUM (10)
static
作用于函數時的功能
用
static
声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分。
—–來自《the c program language》
賦值運算符
什麼是賦值運算符?
op=
其中op == “+, -, ×, /, %, &, |, ^, <<, >>”
賦值運算符只需要計算一次
普通運算符需要計算2次
能提高編譯器的效率
運算符
預算符
()
表示函數調用
運算符->
和.
用於訪問結構成員
sizeof(對象長度)
運算符
條件表達式
什麼是條件表達式?
(a) ? b : c ;
等價於:if(a) b;
else c;
可以取代if-else
結構
其他
'\0'
等于0
,也等于NULL
。
函数必须用指针变量做参数接收传递下来的地址,而函数参数中出现的数组名(比如说:
char array[]
只是为了对应传递而来的数组名,其实是指针变量,因为数组名是不能接收地址的,是常量(a = pointer
不允许。能存储地址的是指针,也叫指针变量。
于是,函数中的形参char array[]
就可以计算了:array = pointer
在所有运算符中,下面四个运算符的优先级最高:结构运算符
.
和->
,用户函数调用的()
以及用于下表的[]
比如说:++p->len
自增的值是len
而不是p
。:-)
*p->str++
自增的是str,而*p++->str
自增的是p
自引用实例的结构是非法的:
struct str{ struct str s; };
自引用指针的结构是合法的:struct str{ struct str *p; };
struct wordtree **node;
: 从右往左翻译:node
是一个指针,这个指针保存的是指针的地址,这个被保存地址的指针指向的是struct wordtree
类型的结构体变量。同样的翻译规则可以用来翻译const
类型变量。:-)
因为传递到函数参数中的数组其实是一个地址,那么传递到函数参数中的指针数组其实是一个指向指针的指针:
char *str[]
披着指针数组的皮实质上是:char **str
。
int printf (char *format, arg1, arg2, ...);
将arg1...
参数按照format
的要求进行转换和格式化。这里参数的存储是一个限制条件,format
是一个限制条件。
可以把format
理解为管道:-)
所以printf
称为格式化输出:-)
使用地址的最根本原因就是要改变对应存储空间的值。
#define getc(p) (--(p)->cnt >= 0 ? (unsigned char) *(p)->ptr++ : _fillbuf(p))
getc(FILE *p)
宏从文件流中读取一个字符。
if((f->flag & (_WRITE|_EOF|_ERR)) != _WRITE) return EOF;
意思是希望flag
没有_EOF
属性,也没有_ERR
属性,只有_WRITE
属性。
系统调用
read
和write
分别将文件中的数据读入缓冲区,将缓冲区的数据写入文件。
Python中的
range
特性真的是很好,比如说range(0,5)
代表了0,1,2,3,4
这5个元素,就如同for(i=0;i<5;i++)
。《c陷阱与缺陷》中有讲为什么要用i<5
而不用i<=4
,我记得其中一个原因就是<5
中的5很直观,一看就是有5个元素,用<正好,用<=4
还得在心里默默数:4+1=5
共5个数