《C和指针》读书笔记


看过了经典的K&R C,又看了这本Pointers on C,温习了C语言的基本语法。

在重温过程中,感觉需要重点把握的知识是指针、结构和动态内存分配

这对今后的算法和操作系统方面的研究学习很有帮助。


3.2.3 声明指针

int* b, c, d;

本以为这条语句把三个变量声明为整型的指针,但事实并非如此。
星号*只对b有用,其余两个变量只是普通的整型。正确语句:int *b, *c, *d;


3.3 typedef

允许为各种数据类型定义新名字。
#define无法正确地处理指针类型,如下:
#define d_ptr_to_char char *
d_ptr_to_char a, b;
只正确地声明了a,但是b却被声明为一个字符。


3.4 常量

int const *pci;     // 一个指向整型常量的指针
int * const cpi;    // 一个指向整型的常量指针


5.4.4 优先级和求值的顺序

两个相邻操作符的执行顺序由它们的优先级决定。
如果它们的优先级相同,它们的执行顺序由它们的结合性决定。
除此之外,编译器可以自由决定使用任何顺序对表达式进行求值。


5.8 问题

2.下面程序的结果是什么?

int func(void)
{
static int counter = 1;
return ++counter;
}

int main()
{
int answer;
answer = func() - func() * func();
printf("$d\n", answer);
}


6.13 指针运算

当一个指针和一个整数执行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。
即把整数量乘以指针所指向类型的大小。

指针 +/- 整数

指针 - 指针
只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针。

< <= > >=
可以在两个任意的指针间执行相等或不等测试。


7.2 函数声明

如果没有关于调用函数的特定信息,编译器便假定在这个函数的调用时参数的类型和数量是正确的。它同时会假定函数将返回一个整型值。如果编译器认定函数返回一个整型值,它将产生整数指令操纵这个值。
float f;
f = xyz();
xyz的返回值会被假定为整型,当成整型返回然后转换成浮点型。


7.5 递归

许多教科书都把计算阶乘和斐波那契数列用来说明递归,这是非常不幸的。在第1个例子里,递归并没有提供任何优越之处。在第2个例子中,它的效率之低是非常恐怖。


8.1 一维数组

对于int类型的数组,数组名的类型就是“指向int的常量指针”。
int a[10];
int *c;
a = c;     // error

int ap[10];

ap:指针变量中的值,即数组的起始地址。
*ap:ap[0]
ap[0]
ap + 6:数组地址加6,即第6个元素的地址。
*ap + 6:ap[0]+6
*(ap + 6):ap[6]


9.2 字符串长度

size_t strlen(char const *string);

注意strlen返回一个类型为size_t(无符号整型)的值。在表达式中使用无符号数可能导致不可预料的结果。
if ( strlen(x) >= strlen(y) ) ...
if ( strlen(x) - strlen(y) >= 0) ...
第1条语句能按照你预想的那样工作,第2条语句的结果将永远为真。>=左边的表达式将是无符号数,而
无符号数绝不可能是负的。
类似的:
if ( strlen(x) >= 10) ...
if ( strlen(x) - 10 >= 0) ...
原因同上。


9.3 不受限制的字符串函数

复制:char *strcpy(char *dst, char const *src);
拼接:char *strcat(char *dst, char const *src);
比较:int strcmp(char const *s1, char const *s2);
注意常见错误:if(strcmp(a, b))。以为如果两个字符串相等,它的结果将是真。恰恰相反。


9.5 字符串查找基础

查找一个字符
char *strchr(char const *str, int ch);
char *strrchr(char const *str, int ch);

char string[20] = "Hello there, honey."
char *ans;
ans = strchr(string, 'h');     // ans=string+7

查找任何几个字符
char *strpbrk(char const *str, char const *group);

ans = strpbrk(string, "aeiou");     // ans=string+1

查找一个子串
char *strstr(char const *s1, char const *s2);
这个函数在s1中查找整个s2第1次出现的起始位置,并返回一个指向该位置的指针。


9.9 内存操作

void *memcpy(void *dst, void const *src, size_t length);
和strn开头的函数不同,它们在遇到NUL字节时并不会停止操作。

char temp[SIZE], values[SIZE];
memcpy(temp, values, SIZE);     // 复制char数组

int temp[SIZE], values[SIZE];
memcpy(temp, values, sizeof(values));     // 复制int数组要考虑移植性

int temp[5], values[SIZE];
memcpy(temp, values, 5 * sizeof(values[0]));     // 复制int数组的前5个元素


10.1 结构基础知识

struct SIMPLE {
int         a;
char      b;
float      c;
};
struct SIMPLE x;
struct SIMPLE y[20], *z;

也可以将结构创建成一种新的类型。

typedef struct {
int      a;
char    b;
float    c;
} Simple;
Simple x;
Simple y[20], *z;


结构的自引用
struct SELF_REF2 {
int     a;
struct SELF_REF2 *b;
int     c;
} A;

如果声明struct SELF_REF2 b;则此结构定义是非法的。因为编译器在结构的长度确定之前就已经知道指针的长度,所以声明成指针才是合法的。

访问方式:*(A.b).a 或 A->b.a


10.3 结构的存储分配

struct ALIGN {
char a;
int    b;
char c;
};

编译器按照成员列表的顺序一个接一个地给每个成员分配内存,可以在声明中对结构的成员列表重新排列。

struct ALIGN2 {
int    b;
char a;
char c;
};


10.4 作为函数参数的结构

void f(struct ALIGN a);     // 调用函数时要拷贝整个结构到栈中
void f(struct ALIGN *a);    // 只传递4字节的指针


10.5 位段

struct CHAR {
unsigned ch : 7;
unsigned font : 6;
unsigned size : 19;
} ch1;

size位段过大无法容纳于一个短整型,但其余位段都比一个字符还短。
位段使程序员能够利用存储ch和font所剩余的位来增加size的位数,避免声明
一个32位的正数来存储size位段。

访问磁盘控制器的例子,假设其地址为0xc0200142。

struct DISK_REGISTER_FORMAT {
unsigned     command     : 5;
unsigned     sector          : 5;
unsigned     track            : 9;
...
unsigned     ready           : 1;
};

#define DISK_REGISTER ((struct DISK_REGISTER_FORMAT *) 0xc0200142)

// 告诉控制器从哪个扇区哪个磁道开始读取
DISK_REGISTER->sector = new_sector;
DISK_REGISTER->track   = new_track;
DISK_REGISTER->command = READ;

while ( !DISK_REGISTER->ready)
;


10.6 联合

union {
float     f;
int        i;
} fi;

fi.f = 3.14159;
printf("%d\n", fi.i);

首先把π的浮点表示形式存储于fi,然后把这些相同的位当做一个整型值打印输出。


11.1 - 3

malloc:
void *malloc(size_t size);
void free(void *pointer);
这些函数维护一个可用内存池。当一个程序另外需要一些内存时,malloc从
内存池中提取一块合适的内存。

calloc:
void *calloc(size_t num_elements, size_t element_size);
calloc在返回指向内存的指针之前把它初始化为0。

realloc:
void realloc(void *ptr, size_t new_size);
如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,
并把原先那块内存的内容复制到新的块上。


11.5 常见的内存错误

1. 忘记检查所请求的内存是否成功分配。

int *pi;
pi = malloc(100);
if (pi == NULL) {
printf("Out of memory!\n");
exit(1);
}

2. 操作内存时超出了分配内存的边界。

3. 传给free函数一个指针,让它释放一块并非动态分配的内存。
试图释放一块动态分配内存的一部分也有可能出错。

pi = malloc(10 * sizeof(int));
free(pi + 5);

4. 内存泄露



转载于:https://www.cnblogs.com/xiaomaohai/archive/2012/02/04/6157871.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA设计者的5项基本功

记得《佟林传》里&#xff0c;佟林练的基本功是“绕大树、解皮绳”&#xff0c;然后才练成了什么“鬼影随行、柳叶绵丝掌”。 在我看来&#xff0c;成为一名说得过去的FPGA设计者&#xff0c;需要练好5项基本功&#xff1a;仿真、综合、时序分析、调试、验证。 需要强调的一点是…

unity 全息交互ui_UI向3D投影全息界面的连续发展

unity 全息交互uiThe user interface has been natural in its evolution and strategically heading towards the 3D-projection holographic interface (3D-PHI) era.用户界面在其发展过程中一直很自然&#xff0c;并且在战略上正朝着3D投影全息界面( 3D-PHI )时代迈进。 Si…

开发工具 快捷键整理

快捷键大全 JAVA 开发工具 MyEclipse -------------------------------------MyEclipse 快捷键1(CTRL)-------------------------------------Ctrl1 快速修复CtrlD: 删除当前行 CtrlQ 定位到最后编辑的地方 CtrlL 定位在某行 CtrlO 快速显示 OutLine CtrlT 快速显示当前类…

前端构建新世代,Esbuild 原来还能这么玩!

大家好&#xff0c;我是若川。持续组织了5个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。今天分享一篇esbui…

大三下学期十四周总结

在小组的学习方面&#xff0c;这周主要是对微信小程序的学习。对JSON格式请求在Spring boot与小程序之间的交互有了一些了解。对微信的接口wx.request、wx.uploadFile、wx.chooseImage的接口的使用。微信开发后台传过来的响应数据如果不是标准的json格式&#xff0c;需要在小程…

平面设计师和ui设计师_平面设计师为什么要享受所有乐趣?

平面设计师和ui设计师Graphic designers are pretty cool. We have to admit that. Be it their dressing style, their attitude and most importantly their enviable gadgets. Large Mac monitor, wacom tablet, drawing sets, swatchbooks , iPad pro with pencil, humungo…

转:Xcode下的GDB调试命令

Xcode的调试器为用户提供了一个GDB的图形化界面&#xff0c;GDB是GNU组织的开放源代码调试器。您可以在Xcode的图形界面里做任何事情&#xff1b;但是&#xff0c;如果您需要您可以在命令行里使用GDB的命令&#xff0c;且gdb可以在终端运行&#xff0c;也可以在Xcode下的控制台…

web表单设计:点石成金_设计复杂的用户表单:12个UX最佳实践

web表单设计:点石成金It’s been a few years that I’ve been taking interest in designing complex user forms, where a lot of information is requested from users. Here are a few industries where you regularly find such flows:几年来&#xff0c;我一直对设计复杂…

跨平台开发框架到底哪家强?5款主流框架横向对比!

跨平台开发框架到底哪家强&#xff1f;目前市场上有多个专业做跨平台开发的框架&#xff0c;那么对开发者来说究竟哪一个框架更符合自己的需求呢&#xff1f;笔者特地总结对比了一下不同框架的特性。国内外笔者选择了一共5个主流的测评对象&#xff0c;分别是RN&#xff0c;Flu…

【一句日历】2019年6月

【2019年6月1日儿童节星期六】 人们在协商&#xff0c;解决和处理各种状况时&#xff0c;若要获得圆满的结果&#xff0c;平静的心和自我控制能力必不可少。任何人都明白。如果我们不能很好地控制自我&#xff0c;反而让焦躁和嗔怒干扰了我们&#xff0c;那么我们的工作不再具有…

Android学习摘要一之Android历史

Google与你998年9月7日创立&#xff0c;经过十几年在搜索引擎方面的精耕细作&#xff0c;成为全球互联网巨头&#xff0c;尤其在地图搜索的应用更是引人注目。Google与2007年11月5日宣布基于Linux平台的开源手机操作系统&#xff0c;名称为Android&#xff0c;中文译为“机器人…

c#创建web应用程序_创建Web应用程序图标集的6个步骤

c#创建web应用程序I am not great at creating logos or icons, mainly because of the lack of practice. So when I was tasked to create an unique icon set for our web app, I wasn’t confident that things will turn out right. After researching effective and rele…

基于pnpm + lerna + typescript的最佳项目实践 - 理论篇

本文来自作者金虹桥程序员 投稿原文链接&#xff1a;https://juejin.cn/post/7043998041786810398本系列文章分为两篇&#xff1a;理论篇和实践篇 理论篇&#xff1a;介绍pnpm&#xff08;pnpm的特点、解决的问题等&#xff09;、lerna&#xff08;lerna的常用命令&#xff09;…

nginx 多进程 + io多路复用 实现高并发

一、nginx 高并发原理 简单介绍&#xff1a;nginx 采用的是多进程&#xff08;单线程&#xff09; io多路复用(epoll)模型 实现高并发 二、nginx 多进程 启动nginx解析初始化配置文件后会 创建&#xff08;fork&#xff09;一个master进程 之后 这个进程会退出 master 进程会…

转载:程序员从初级到中级10个秘诀

Justin James曾发表过一篇博文《10 tips for advancing from a beginner to an intermediate developer》&#xff0c;为我们分享如何才能完成程序员从初级到中级的蜕变&#xff0c;现将中文译文转载于此&#xff0c;供大家借鉴。 在一封与TechRepublic会员交流的邮件当中&…

ux设计工具_UX设计中的工具和实用主义

ux设计工具There’s a zillion tools for User Experience and User Interface Design. Don’t take my word for it: a simple Google search for “what are the best tools for wireframing” (to take just one aspect of UX) leads you to endless pages of “The 20 best…

幕后常驻嘉宾配音小姐姐的2021年度总结

大家好&#xff0c;我是若川。这是公众号幕后常驻嘉宾配音小姐姐&#xff0c;看完了上一个阿源小姐姐的年度总结《一张图看程序媛阿源的2021个人年度流水账》&#xff0c;写的年度总结投稿。点击以下音频可以查看收听往期更多音频。以下是正文~Hi&#xff0c;大家好呀~我是若川…

java spring cloud版b2b2c社交电商spring cloud分布式微服务:服务注册与发现(Eureka、Consul)...

Spring Cloud简介电子商务社交平台源码请加企鹅求求&#xff1a;一零三八七七四六二六。Spring Cloud是一个基于Spring Boot实现的云应用开发工具&#xff0c;它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布…

js 全选

<form name"frm" method"post" action"/add" onsubmit"return check()"><table class"titem" ><tr><td class"field"> * 所属批次</td><td class"value"><sele…

结果规格化_结果

结果规格化If you’ve seen an Instagram story involving a question and people tilting their heads, you probably were looking at the “Who Is More” Instagram filter. In this article, I will share the creative process and decision making behind this filter.如…