《C语言程序设计现代方法》笔记

p102
当把有符号操作数和无符号操作数组合时,把有符号操作数“转换”成无符号的值。转换过程中需要加上或者前去n+1的倍数,其中n是无负荷类型能表示的最大值。

p123

int a[] = {4, 9, 1, 8, [0] = 2, 3};   int a[] = {2 ,3, 1, 8}

p156
在局部变量声明中放置static可以使变量具有静态存储期限,由于静态存储期限的变量拥有永久存储单元,故在整个程序执行期间都会保留变量的值。静态局部变量始终有块作用域,对其他函数不可见。

p179
永远不要在函数结束时,返回指向自动局部变量的指针。

p181
void f1(const int *p) 函数不能修改指针p指向的整数,但是可以修改p自身,即做*p=0不行,但p=&k可以。
void f2(int * const p) 函数可以修改指针p指向的整数,但是不可以修改p自身,即做*p=0可行,但p=&k不可以。

p185
指针算数运算
指针加上整数(p = &a[i]; p+j指向a[i+j]);
指针减去整数、指针相减(p = &a[i];q = &a[j]; p-q == i -j)。

p187
*运算符和++运算符的组合
*p++或*(p++):值为*p,再自增p;
(*p)++:值为*p,再自增*p;
*++p或*(++p):先自增p,值为*p;
++*p或++(*p):先自增*p,值为*p。

p193
int a[NUM_ROWS][NUM_COLS],a不是指向a[0][0]的指针,而是指向a[0]的指针。
从C语言的观点看,a实际是一位数组,数组的每个元素又是一维数组。用作指针时,a的类型是int (*)[NUM_COLS](指向长度为NUM_COLS的整型数组的指针)。

p199
延续字符串字面量(下述第一种方法改变了缩进)

printf("this is the first part\
--and the next part")

printf("this is the first part"
            "and the next part")

p207

strncpy(str1, str2, sizeof(str1) - 1);str1[sizeof(str1) - 1] = '\0';

p270
对结构的操作
允许直接赋值,如下结构可part=part2; 结构内数组亦可被赋值。

struct {
    int number;
    char name[NAME_LEN+1];
    int on_hand;
} part1, part2;

p281
联合
编译器只为联合中最大的成员分配足够的内存空间,联合成员在这个空间内彼此覆盖。

p300

void *realloc(void *ptr, size_t size)

如果函数第一个实际参数为空指针,则它与malloc一样;如果函数第二个参数为0, 则它会释放掉内存块。

p313
指向指针的指针

struct node *add_to_list(struct node *first, int n)

实际入参为指针first_real,函数调用时为值传递,此函数内修改first变量,对于直接入参没有影响。

void add_to_list(struct node **first, int n)

实际入参为指针地址&first_real,函数调用时传递的是指针变量自己的地址,函数内修改*first变量,即first_real指针变量的值。

p328
存储类型
auto、static(静态存储期限)、extern、register(寄存器变量,编译器可能选择存储在内存,不能使用取地址&运算)

p337
未初始化变量
具有静态存储期限的变量的初始式必须是常量。
具有自动存储期限的变量没有默认的初始值;具有静态存储期限的变量默认值为零。

p364
移位运算符的优先级比算术运算符的优先级低。
若需要一个整数,除了最后5位其他的位全都为1,可写成~0x1f,以使底层程序可移植性更好,不依赖于整数所包含的位数。
设置位:i |= 1 << j;
清除位:i &= ~(1 << j);
测试位:if (i & i << j)

p373
volatile
某些内存空间是“易变”的,volatile类型限定符可以通知编译器,每次读取此变量时,都从内存空间读取而不是寄存器备份。

p388
当打开文件用于读和写(模式字符串包含字符+)时,有一些特殊规则:
如果没有先调用一个文件定位函数,就不能从读模式转换为写模式,除非读操作遇到文件尾;
如果既没有调用fflush函数也没有调用文件定位函数,那么就不能从写模式转换为读模式。

p389

FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream)

以指定模式重新指定到另一个文件。模式用于指定新文件的访问方式。
filename:需要重定向到的文件名或文件路径。
mode:代表文件访问权限的字符串。例如,”r”表示“只读访问”、”w”表示“只写访问”、”a”表示“追加写入”。
stream:需要被重定向的文件流。
返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。
当标准输出stdout被重定向到指定文件后,没有任何方法可以恢复原来的输出流。

p393
…printf转换说明

 标志   最小字段宽度  精度 长度修饰符    转换说明符
% #0       12       .5      L          g

标志:-(左对齐)、+(有符号数)、空格(有符号数转换得到的非负数前面加空格)、#(八进制、十六进制数)、0(前导零在字段宽度内填充);
精度:转换说明符d、i、o、u、x、X,精度表示最少位数;转换说明符a、A、e、E、f、F,精度表示小数点后的位数;
转换说明符g、G,精度表示有效数字个数;转换说明符s,那么精度表示最大字节数。
长度修饰符:h,表示short型,l表示long型,ll表示long long型,z表示size_t,L表示long double。

p398
…scanf函数的格式串中可能包含三种信息:
转换说明。大多数转换说明(%[、%c、%n例外)会跳过收入项开始处的空白字符,但不会跳过尾部的空白字符。
空白字符。格式串中的一个或多个连续的空白字符与输入流中的零个或多个空白字符相匹配。
非空白字符。除了%之外的非空白字符和输入流中的相同字符相匹配。

转换说明
字符*:赋值屏蔽,读入此数据项,但是不会把它赋值给对象,且此匹配数据不包含在返回计数中。
最大字段宽度:限制了输入项中的字符数量。
长度修饰符。
转换说明符:n,相应的实参必须指向int类型的对象。把到目前为止读入的字符数量存储到此对象中,返回计数不受影响。

p407

size_t fread(void *restrict ptr, size_t size, size_t nmemb, FILE *restrict stream);

fread(a, 1, 100, fp),返回值在0至100之间;
fread(a, 100, 1, fp),返回值不是0就是1。

p407

int fgetpos(FILE *restrict stream, fpos_t * restirct pos):获取文件当前位置;
int fsetops(FILE stream, const fpos_t *pos):移动至指定位置;
long int ftell(FILE *stream):获取文件当前位置;
int fseek(FILE *stream, long int offest, int whence):移动至指定位置;
void rewind(FILE stream):把文件位置设置在起始处。

p410
snprintf,写入字符串的字符不会超过n-1,结尾的空字符不算;只要n不是零,都会有空字符。(最多向字符串写入n个字符,最后一个是空字符)。

p435

isalnum(int c):是否为字母或数字;
isalpha(int c):是否是字母;
isblank(int c):是否是标准空白字符(空格和水平制表符\t);
iscntrl(int c):是否是控制字符;
isdigit(int c);是否是十进制数字;
isgraph(int c):是否是可显示字符(除空格外);
islower(int c):是否是小写字母;
isprint(int c):是否是可打印字符(包括空格);
ispunct(int c):是否是标点符号;
ispace(int c):是否是空白字符(空格、换页符\f、换行符\n、回车符\r、水平制表符\t、垂直制表符\v);
isupper(int c):是否是大写字母;
isxdigit(int c):是否是十六进制数字。

tolower(int c);当入参不是字母时,返回原始字符。
toupper(int c);

p440

搜索函数
void *memchr(const void *s, int c, size_t n):搜索指定数量字符后结束;
char *strchr(const char *s, int c):搜索指定字符;
char *strrchr(const char *s, int c):反向搜索指定字符;
size_t strcspn(const char *sl, const char *s2):当给定一个需要搜索的字符串及一组需要搜索的字符时,返回第一个属于该组字符的字符的下标;
size_t *strspn(const char *s1, const char *s2):当给定一个需要搜索的字符串及一组需要搜索的字符时,返回第一个不属于该组字符的字符的下标;
char *strpbrk(const char *s1, const char *s2):返回指向第一个参数中与第二个参数中任意一个字符匹配的最左边一个字符;
char *strstr(const char *s1, const char *s2):在第一个字符串中,搜索第二个字符串,返回指向搜索字符串第一次出现的地方的指针;
char *strtok(char *restrict s1, const char * restrict s2):根据分隔符切割字符串;

p482

void va_start(va_list ap, parmN):将可变参数列表中可变长度部分设置为paramN后边的位置;
类型 va_arg(va_list ap, 类型):获取当前参数,并且前进到下一个参数的位置;
void va_end(va_list ap):结束清理;
void va_copy(va_list dest, va_list src):从src复制到dest;

p485

double atof(const char *nptr);
int atoi(const char *nptr);
long int atol(const char *nptr);
long long int atoll(const char *nptr);

p488

int rand(void):生成随机数0~RAND_MAX;
void srand(unsigned int seed):为rand函数提供种子值,每个种子值确定了一个特定的伪随机序列!(程序内srand仅需调用一次);

p492

int abs(int j);
long int labs(long int j);
long long int llabs(long long int j);
div_t div(int number, int denom):div_t.quot商,div_t.rem余数;
ldiv_t ldiv(long int number, long int denom);
lldiv_t lldiv(long long int number, long long int denom);

p493

clock_t clock(void):
返回程序从开始执行到当前时刻的处理器时间,转换为秒(clock() start_clock)/CLOCKS_PER_SEC;
time_t time(time_t *timer):返回当前日历时间;
double difftime(time_t time1, time_t time0):返回time0和time1之前按秒衡量的差值;
time_t mktime(struct tm *timeptr):把分解时间(入参)转换为日历时间,同时会将分解时间调整为合法值;

p495

char *asctime(const struct tm *timeptr);
char *ctime(const time_t *timer);
struct tm *gmtime(const time_t *timer);
struct tm *localtime(const time_t *timer);
size_t strftime(char * restrict s, size_t maxsize, const char * restrict formast, const struct tm * restrict timeptr)(对时间进行格式化);

日历时间(time_t)->分解时间(struct tm):gmtime、localtime
分解时间(struct tm)->日历时间(time_t):mktime
日历时间(time_t)->字符串:ctime
分解时间(struct tm)->字符串:asctime、strftime

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值