Head First C (前半部分)读书笔记
2016-01-25 12:58
190 查看
记录一些之前没有注意到的小细节。
这里
若要直接输出字符串则可以使用
输出结果为
doses[3] == *(doses + 3) == *(3 + doses) == 3[doses]
结构体/联合体初始化:
(结构体可也可直接赋值,如:
指针退化是指将数组地址赋值给指针变量时长度信息丢失的情况,即:数组地址包含地址信息和长度信息(用sizeof),而指针变量只包含地址信息。如:
输出结果为:
故将数组地址作为函数参数时,要考虑是否需要加多一个长度参数接收数组的长度。
位字段主要用于一些使用空间很宝贵的程序设计中,如嵌入式程序设计。成员类型必须为
在同一结构中,位字段才能节省空间。
在C语言中,所有的表达式都有值。如:
在
char ex[20]; scanf("%19s", ex);
scanf()用于吸收结构化字符串,
%19s可以防止数组越界,不吸收回车。
fgets(ex, sizeof(ex), stdin);
fgets()用于吸收非结构化字符串,
sizeof(ex)是吸收的字符串的总长度,包括
'\0',这里为
20,吸收回车。
int j; scanf("%i", &j);
%i自动将输入转化为十进制,接受的输入样式为:十进制、十六进制、八进制,如:
12,
0xc,
014。
printf("%i", j);
这里
%i和
%d没什么区别。另外,
printf()用于输出格式化字符串,实际上调用
fprintf(),即:
fprintf(stdout, "%i", j);
若要直接输出字符串则可以使用
puts(),如:
puts("Hello world!");
puts()会自动在字符串结尾输出回车。即:
puts("");==
printf("\n");
int doses[] = {1, 3, 2, 1000}; printf("%i", 3[doses]);
输出结果为
1000,参考帖子:*(3+doses)怎么就等于3[doses]了
doses[3] == *(doses + 3) == *(3 + doses) == 3[doses]
结构体/联合体初始化:
typedef union { short count; float weight; float volume; } quantity;
quantity p = {4};C89方式,保存为第一字段的值。
quantity q = {.weight = 4.0};C99标准,指定初始化器。
quantity r; r.volume = 4.0;”点“表示法。
(结构体可也可直接赋值,如:
quantity s = {4, 4.0, 4.0};)
指针退化是指将数组地址赋值给指针变量时长度信息丢失的情况,即:数组地址包含地址信息和长度信息(用sizeof),而指针变量只包含地址信息。如:
char str[] = "Hello world!"; char *p = str; printf("%s == %s\n", str, p); printf("%i != %i\n", sizeof(str), sizeof(p));
输出结果为:
Hello world! == Hello world! 13 != 8
故将数组地址作为函数参数时,要考虑是否需要加多一个长度参数接收数组的长度。
位字段主要用于一些使用空间很宝贵的程序设计中,如嵌入式程序设计。成员类型必须为
unsigned int,需要用
:指定成员所占的位数。如:
typedef struct{ unsigned int first_visit:1; unsigned int come_again:1; unsigned int fingers_lost:4; unsigned int shark_attack:1; unsigned int days_a_week:3; }survey;
在同一结构中,位字段才能节省空间。
strdup()将字符串复制到堆上,要用
free()释放空间,不释放会导致内存泄漏。如:
char str[] = "Hello world!"; char *copy = strdup(str); printf("%s == %s\n", str, copy); free(copy);
strdup()头文件为string.h,
free()头文件为stdlib.h。
size_t是
unsigned int类型,是数组下标值的类型,也是
sizeof操作符返回的值的类型,也是
str*相关函数返回的长度等的类型。
在C语言中,所有的表达式都有值。如:
z = y = x = 4。
x = 4返回值为
4,于是
z = y = 4;
y = 4返回值为
4,于是
z = 4。这也就是”连等赋值“。
在
%08x中,
0是标志字符,当输出值的宽度小于最小宽度(这里设置为8)时用”0“(默认用空格)填充。
malloc()返回的是通用指针,即
void *类型的指针。
相关文章推荐
- c#之转义字符
- qt发布 2
- Android基于XMPP Smack openfire 开发的聊天室(二) 【聊天信息、成员】
- Unix时间戳和北京时间相互转换
- Leetcode Bit Manipulation 题型总结
- Win8.1蓝屏错误代码0×c0000034怎么办
- eclipse快捷键
- 操作引入xml文件的书包(定位到指定节点)
- 使用WPScan扫描wordpress获取用户密码
- 解决Xcode7安装KSImageNamed插件不好使问题
- 基于XMPP协议的Android即时通信系
- [Linphone Android] 应答请求
- MFC - 查看操作进程
- Android基于XMPP Smack openfire 开发的聊天室(一)
- RHCE 学习笔记(8) 服务管理
- Korg - AudioGate播放器-DSD
- bukket插件例子(5)-bukkit的列出所有物料
- 在 Eclipse 中使用 PHP
- 新书推荐《从Node.js到iOS学注册登录》
- XML 指定設定節点の取得