c语言学习笔记结合教程《c和指针》Word文件下载.docx
- 文档编号:13792811
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:13
- 大小:25.25KB
c语言学习笔记结合教程《c和指针》Word文件下载.docx
《c语言学习笔记结合教程《c和指针》Word文件下载.docx》由会员分享,可在线阅读,更多相关《c语言学习笔记结合教程《c和指针》Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
若某个操作符的各个操作数属于不同的类型,则除非其中一个操作数转换为另一个操作数类型,否则操作无法进行。
问:
该规则是否也针对赋值操作符“=”?
不过等号右边的操作数(右值)自动转换成了左值的类型。
以上概念是针对算术操作符而言的。
算术操作符就是+-*/%。
问:
那对于其它操作符呢?
尤其是关系操作符?
(2)不同类型操作数互相赋值时的精度变化情况:
从int到float:
精度可能会降低(有点例外)。
Float只能保证6位有效数字的精度(浮点型以指数方式存储),虽然长度为4个字节。
在32位平台上,通常int是4字节长度,最多表示到21亿多,而int型是“绝对精确”的,换句话说,就是int行最多可以保证10位十进制有效数字的精确度。
而float只能保证6位有效数字的精确度,因此int到float的转换是可能丢失精度的。
比如整数“1234567899”转换成float后,大约是:
1.23457936乘10的9次方,也就是从第7位有效数字开始已经不准确了。
double可以保证15位10进制有效数字的精度,所以从int到double不会有这个警告。
(以上摘录自网络。
(3)左值与右值的注意点?
左值可以是变量或表达式,但必须能标识一个可以存储结果值的地点。
2.位运算问题:
(1)无符号数与有符号数左移,右移(<
<
>
)的异同?
它们的左移均为逻辑移位(补0);
无符号数的右移也是逻辑移位(因为无符号数无须担心符号位问题);
但有符号数的右移方式(逻辑移位还是算术移位)取决于编译器的类型(因而是不可移植的)。
(2)逻辑移位与算术移位的区别?
逻辑移位补0;
算术移位(似乎只用于右移):
左边移入的位根据有符号数符号位值决定是0还是1。
3.各种数据类型的长度及注意点
(1)整型:
(长整型至少应该和整型一样长,整型至少应该和短整型一样长。
char,signedchar,unsignedchar,shortint,unsignedshortint,int,unsignedint,longint,unsignedlongint
其中,shortint至少16位,
limits.h中说明了各种不同整型类型的特点:
p30
signed
unsigned
类型
最小值
最大值
字符
SCHAR_MIN(-128)
SCHAR_MAX(127)
UCHAR_MAX(0xff)
短整型
SHRT_MIN(-32768)
SHRT_MAX(32767)
USHRT_MAX(0xffff)
整型
INT_MIN
(-2147483647-1)
INT_MAX
(2147483647)
UINT_MAX
(0xffffffff)
长整型
LONG_MIN
(-2147483647L-1)
LONG_MAX
(2147483647L)
ULONG_MAX
(0xffffffffUL)
整型字面值(整型字面值常量):
可以是9种整型中的任何一种。
(2)浮点类型:
longdouble至少和double一样长,而double至少和float一样长。
头文件float.h中有记录:
MAX
MIN
float
FLT_MAX(3.402823466e+38F)
FLT_MIN(1.175494351e-38F)
double
DBL_MAX
(1.7976931348623158e+308)
DBL_MIN
(2.2250738585072014e-308)
longdouble
LDBL_MAX
(DBL_MAX)或
(1.189731495357231765e+4932L)
LDBL_MIN
(DBL_MIN)或
(3.3621031431120935063e-4932L)
注:
浮点数字面值总是写成10进制的形式,必须有一个小数点或一个指数。
(3)指针
4.static,extern,const
5.C中的抽象数据类型(ADT:
abstractdatatype)是什么?
也称“黑盒”。
由接口和实现2部分组成。
接口是公有的,一般定义在头文件中,说明用户如何使用ADT提供的功能;
实现是私有的,是实际执行任务的部分(实现细节对客户不可见)。
比如:
可将常量或函数等的申明放在头文件中,函数的定义放在源文件中。
而这些函数还可以调用更为细节的且被定义为static的处理函数(static函数对外不可见)。
具体可见例子p125。
6.关于提高程序效率的一些建议:
(1)尽量使用编译时求值的表达式(如常量表达式),而减少使用运行时求值的表达式(代价更高)。
(2)在for循环里减少计数器的使用(可能的话),如下:
(p148)
#defineSIZE50
intx[SIZE];
inty[SIZE];
voidtry()
{
registerint*p1,*p2;
for(p1=x,p2=y;
p1<
&
x[SIZE];
)
*p1++=*p2++;
}
(3)数组操作时:
使用指针往往比使用下标更有效率(但不一定);
指针的效率永远不会低于下标(理论上)。
(4)声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高。
(5)自动变量(尤其是数组)如果在函数或代码块中经常要被初始化,可以考虑将其设为static,这样只需在程序开始前初始化一次。
(6)结构中成员之间的边界对齐问题:
p206
结构的起始位置必须是结构中边界要求最严格的数据类型所要求的位置,如下:
structALIGN{chara;
intb;
charc;
};
sizeof(ALIGN)则显示要占12字节。
因为int型的存储位置必须能被4整除,结构起始位置则也一样。
所以3个成员将各占4个字节。
如果改为这样:
structALIGN{intb;
chara;
则只占8字节(其中2个字符紧挨在一起)。
(必要时需对结构中成员的排序进行优化。
单个字节(char)能对齐到任意地址
2字节(short)以2字节边界对齐
4字节(int,long)以4字节边界对齐
sizeof得到结构的整体长度,包括因边界对齐而跳过的字节。
宏offset(定义在stddef.h中)确定结构中某个成员的实际位置。
如:
offsetof(structALIGN,b)
7.运算符优先级中一些注意点,一些比较重要的优先级:
(1)*与++/--的结合
从高到低:
.->
++(后缀)--(后缀)!
++(前缀)--(前缀)*(间接访问)
(取址)
8.指针,数组中的注意点(多重指针,指针数组,多维数组)
(1)数组名是一个指向某某型的常量指针(是常量!
),它的值是第一元素的地址。
但有两个例外:
被用作sizeof或&
的操作数。
前者返回整个数组的长度;
后者产生一个指向数组的指针(不是指向某某型的常量指针)。
P141。
(2)以下3者等价:
array[2];
2[array];
*(array+2);
(3)inta[5];
和int*b;
的区别:
p150
声明数组,则同时根据指定的元素数量分配了内存空间,并以作为常量指针的数组名指向这段内存空间的起始位置。
声明指针变量,编译器只为指针本身保留内存空间,不为任何整型值分配内存空间。
所以:
此时*a是合法的,*b是非法的。
但b++能编译,a++却不能(常量)。
做测试:
char*a=“abc”;
charb[]=‘”abc”;
char*c=a;
各自的++。
(4)数组声明时的初始化:
inta[5]={2,5,1};
则后2位自动设0。
Inta[]={1,2,3,4,5};
则长度自动设为5。
(5)chara[]=‘”Hello”;
char*b=“Hello”;
两者效果一样,但含义不同。
P153。
(6)2维数组一定要理解为数组中包含子数组的形式。
理解:
p157(想像一下指针数组,但并不一样)
inta[3][10];
其中:
a(指向子数组的指针,好比指向指针的指针)
a+1(指向第2个子数组的指针)
*(a+1)(指向子数组中第1个整型值的指针(仍是指针!
))
*(a+1)+5(指向子数组第6个整型值的指针)
*(*(a+1)+5)(子数组第6个整型量的值)
以下等价:
*(a+1)和a[1]
*(a+1)+5和a[1][5]
(7)c中若写a[3,4],则等同于a[3]。
p158
9.C中函数的参数都是按值传递的(拷贝形式,无须担心值被改,但数组会被改)。
包括指针!
将实参的指针的拷贝赋给形参,形参可直接修改所指内存地址中的值,但指针是以拷贝的形式传递的,所以还是按值传递的。
好处是并未破坏原来的指针。
值传递易产生“切割问题”。
如下:
ClassWindow{
Public:
Virtualvoiddisplay()const;
};
ClassWindowWithScrollBars:
publicWindow{
VoidprintNameAndDisplay(Windoww){
w.display();
WindowWithScrollBarswwsb;
printNameAndDisplay(wwsb);
因为参数仅仅是拷贝,所以不可能把WindowWithScrollBars中不属于Window的部分复制给Window对象。
所以调用的是WindowWithScrollBars的display(),哪怕它是虚函数。
所以要采用byreference-to-const的方式,当然,这仅指对象,若是内置类型入int,还是用passbyvalue较好(见《Effectivec++》p88)
10.C中常用的字符,字符串处理函数:
(注:
size_t定义在stddef.h中,代表无符号整数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c和指针 语言 学习 笔记 结合 教程 指针