学习笔记

本文涵盖了C语言的基础知识、编程技巧、宏定义、赋值运算符、静态作用、函数参数传递、指针操作、优先级运算符、结构体与指针应用,以及C语言在操作系统、Linux、开源领域的应用。深入探讨了C语言中的const用法、#define使用注意事项、static作用于函数的功能,并介绍了C语言在实际项目中的实践应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一些科普内容

内容来自 百度百科 以及 维基百科


计算机科学
图像处理
模式识别
人工智能
全角


开源
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属性。


系统调用readwrite分别将文件中的数据读入缓冲区,将缓冲区的数据写入文件。


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个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值