都说c语言程序设计知识点的知识点比较散乱 谁有总结的一些笔记 谢了

郝斌C语言笔记_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
郝斌C语言笔记
上传于||暂无简介
大小:7.95KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢------、期待与您交流! -------
复习C语言的时候,我把李明杰老师的C语言视频过了一遍,把自己认为比较容易出错的地方做了笔记记录在work文件里。
以下是我的部分笔记:
1.scanf函数注意事项:
scanf中不能写 \n
例如:scanf(&%d\n&, &a); // 错误写法
2.定义变量注意事项:
如果要在if、case、for后面定义变量,必须要用大括号来明确变量作用域
2.1 // 下面的代码是错误的,作用域不明确
&if (10 & 6) int a = 5;2.2 & & &// 如果要在case后面定义新的变量,必须用大括号{}包住 &
下面代码正确,若去掉大括号会报错&
switch (c)
case '+':&
int sum = a +&
printf(&和是%d\n&, sum);
case '-':&
&int minus = a -
&printf(&差是%d\n&, minus);
2.2 //错误:变量a的作用域不明确&
//如果要在循环体中定义新的变量,必须用大括号{}包住
&for (int i=0; i&5; i++)
& & & &int a = 10;3.
3.不使用中间变量交换2个变量的值
/* 使用位异或运算符交换两个变量的值*/
&a = a ^ b = a ^ a = a ^
4.\0的作用\0是字符串结束的标记
printf(&%s&, name2); 会从name2这个地址开始输出字符,直到遇到\0为止
5.定义字符串的两种方式
5.1 利用数组
&char name[] = &itcast&;&
特点:字符串里面的字符是可以修改的&
使用场合:字符串的内容需要经常修改
&5.2 利用指针&
char *name = &itcast&;&
特点:字符串其实是一个常量字符串,里面的字符是不能修改&
使用场合:字符串的内容不需要修改,而且这个字符串经常使用&
6.字符串数组的定义
6.1char names[2][10]= {&jack&, &rose&};
6.2 上面等价于char names2[2][10] = { {'j', 'a', 'c', 'k', '\0'}, {'r', 'o', 's', 't', '\0'} };
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:688次
排名:千里之外
原创:11篇谁有c语言学习笔记以及心得 经验?感谢啊感谢_百度知道
谁有c语言学习笔记以及心得 经验?感谢啊感谢
提问者采纳
我qq,可以多交流。多看书,多实践
提问者评价
其他类似问题
为您推荐:
其他1条回答
考试题都是这书里的,然后在电脑上练练,每天6小时以上!
机试,看懂每题,吧题背背。笔试部分。然后看里面的提。其他什么都没买。我只看了12天,叫做 等考通(c++)?我当时买了本书要考国家二级吗。这一本书足矣(题型分为笔试和机试),把卷子做做。就考过了
谢谢 我不考级 纯粹爱好
学习笔记的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1. extern在函数声明中是什么意思?
它可以用作一种格式上的提示表明函数的定义可能在另一个源文件中,但在
extern int f(); 和 int f(); 之间并没有实质的区别。
补充:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。也就是说extern有两个作用:
第 一,当它与&C&一起连用时,如: extern &C& void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目 全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的&脾气&了(不同的编译器采用的方法不一样),为什么这么做呢,因为
C++支持函数的重载;
第二,当extern不与&C&在一起修饰变量 或函数时,如在头文件中: extern int g_I&它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是 说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量, 但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。
2. 怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组?
这个问题至少有以下3种答案:
(1)char *(*(*a[N])())();
(2)用typedef逐步完成声明:
typedef&char&*&&&&&&&
typedef&pc
fpc();&&&&&&& &
typedef&fpc
typedef&pfpc
fpfpc();&&& &
typedef&fpfpc
a[N];&&&&&&&&&&&&
(3)使用cdecl程序,它可以把英文翻译成C或者把C翻译成英文:
通过类型转换,cdecl也可以用于解释复杂的声明,指出参数应该进入哪一对括号(如同在上述的复杂函数定义中)。
补充:cdecl程序非常有用,它可以在C语言的声明和英语之间进行转换。它可以解释一个现存的C语言声明,cdecl 程序可以帮助你分析复杂的声明。
这里有一个在线的cdecl:
3. 为什么struct x { ... }; 不对?
C不是C++。结构标签不能自动生成类型。
补充:也就是在C++中这样是对的。在C中不想用struct只能借助于typedef。
4. NULL可以确保是0,但空指针(null)却不一定。
5. 数组和指针的区别是什么?
数组自动分配空间,但是不能重分配或改变大小。指针必须明确赋值以指向分配的空间(可能使用malloc),但是可以随意重新赋值(即指向不同的对象),同时除了表示一个内存块的基址之外,还有许多其它的用途。
由于数组和指针所谓的等价性,数组和指针经常看起来可以互换,而事实上指向malloc分配的内存块的指针通常被看作一个真正的数组(也可以用[]引用)。但是,要小心sizeof。
6. 当我向一个接受指针的指针的函数传入二维数组的时候,编译器报错了。
数组蜕化为指针的规则不能递归应用。数组的数组(即二维数组)蜕化为数组的指针,而不是指针的指针。数组指针常常令人困惑,需要小心对待:
如果你向函数传递二维数组:
int array[NROWS][NCOLUMNS];
那么函数的声明必须匹配:
void f(int a[][NCOLUMNS]){ ... }
void f(int (*ap)[NCOLUMNS]){ ... } &/* ap是个数组指针 */
在第一个声明中,编译器进行了通常的从“数组的数组”到“数组的指针”的隐式转换;第二种形式中的指针定义显而易见。
因为被调函数并不为数组分配地址,所以它并不需要知道总的大小,所以行数NROWS可以省略。但数组的宽度依然重要,所以列维度NCOLUMNS(对于三维或多维数组,相关的维度)必须保留。
如果一个函数已经定义为接受指针的指针,那么几乎可以肯定直接向它传入二维数组毫无意义。
7. 为什么这段代码不行?
gets(str);&
printf(&%s\n&,
str没有指向任何合法的位置,换言之,我们不知道指针str指向何处。因为局部变量没有初始化,通常包含垃圾信息,所以甚至都不能保证str是一个合法的指针。
改正方法:用局部变量或用malloc()分配str缓冲区。
8. 我刚才试了这样的代码char *p; strcpy(p, &abc&); 而它运行正常?怎么回事?为什么它没有崩溃?
未初始化的指针p所指向的随机地址恰好对你来说是可写的,而且显然也没有用于什么关键的数据。
char *p; 编译器只分配了足够容纳指针本身的内存; 也就是说,这种情况下,你分配了sizeo(char*)个字节的内存。但你还没有分配任何让指针指向的内存,因此此时p所指向的内存可能是垃圾信息也可能是可写的区域,没有崩溃说明是后者。
9. 下面关于itoa的实现为什么是错误的?如何改正?
char&*itoa(int&n)&
&&&&&char&retbuf[20];&&
&&&&&sprintf(retbuf,
&&&&&return&&&&&
这样在编译的时候会出现这样的警告信息“warning C4172: returning address of local variable or temporary”,说明retbuf的地址是临时变量,是暂时的,函数返回时就没有了也就是不能直接返回。
一种解决方案是把返回缓冲区声明为静态变量:
static char retbuf[20];
总结:若要返回字符串或其它集合,则返回指针必须是静态分配的缓冲区,或者调用者传入的缓冲区,或者用malloc()获得的内存,但不能是局部(自动)数组。
10. 为什么在调用free()之后指针没有变空?使用(赋值,比较)释放之后的指针有多么不安全?
当你调用free()的时候,传入指针指向的内存被释放,但调用函数的指针值可能保持不变,因为C的按值传参语义意味着被调函数永远不会改变参数的值。严格的说,被释放的指针值是无效的,对它的任何使用,即使没有解参照,也可能带来问题,尽管作为一种实现质量的表现,多数实现都不会对无伤大雅的无效指针使用产生例外。
补充:free()过后的指针也叫做“野指针”,建议free()过后立即将指针置为NULL,详细原因请看“?”。
11. calloc()和malloc()有什么区别?利用calloc的零填充功能安全吗?free()可以释放calloc()分配的内存吗,还是需要一个cfree()?
calloc(m, n)本质上等价于:
= malloc(m
0, m * n);&
填充的全是零,因此不能确保生成有用的空指针值或浮点零值,free()可以安全的用来释放calloc()分配的内存。
12. 在C中,sizeof('a')=4而不是1,因为C语言中的字符常数是int型,因此sizeof('a')是sizeof(int),这是与C++不同的地方。
13. C语言中没有提高标准的布尔类型,需要用#define或枚举常数定义true/false。
14. 我试图用ANSI“字符串化”预处理操作符#向信息中插入符号常量的值,但它字符串化的总是宏的名字而不是它的值。
你可以用下面这样的两步方法迫使宏既字符串化又扩展:
Str(x) #x&
Xstr(x) Str(x)&
char&*opname
= Xstr(OP);
这段代码把opname置为“plus”而不是“OP”。
总结:在使用符号粘接操作符##连接两个宏的值(而不是名字)时也要采用同样的“迂回战术”。
15. memcpy()和memmove()有什么区别?
如果源和目的参数有重叠,memmove()提供有保证的行为。
而memcpy()则不能提供这样的保证,因此可以实现的更加有效率。
如果有疑问,最好使用memmvoe()。
16. 我如何在printf的格式串中输出一个'%'?我试过&\%&,但是不行。
只需要重复百分号:%%。\%不行,因为\是编译器的转义字符,而这里我们的问题最终是printf的转义字符。
17. 为什么大家都说不要使用gets()?
跟fgets()不同,gets()不能被告知输入缓冲区的大小,因此不能避免缓冲区的溢出。标准库的fgets()函数对gets()作了很大的改进,尽管它仍不完善。如果真的可能输入很长的行,还是需要仔细思考,正确处理。
18. 一个粗陋但通常有效的测试NaN的方法:
isnan(x)&&& ((x) != (x))
C99提高isnan(), fpclassify()及其它一些类别的函数。
附:标准C函数库的源代码:
GNU工程有一个完全实现的C函数库()
19. 怎样判断机器的字节顺序是高字节在前还是低字节在前?
有个使用指针的方法:
if(*(char&*)&x
&&&&printf(&little-endian\n&);&
&&&&printf(&big-endian\n&);&
另外一个可能是用联合。
20. 由一个日期,怎样知道是星期几?
用mktime()或localtime()(注:如果tm_hour的值为0,要注意DST(夏时制)的调整);或者Zeller的congruence;或者这个由Tomohiko Sakamoto提供的优雅的代码:
int&dayofweek(int&y,
&&&&static&int&t[]
= {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};&
-= m & 3;&
&&&&return&(y
+ y/4 - y/100 + y/400 + t[m - 1] + d) % 7;&
微信学习公众平台-媛媛推荐
微信号:programer-idea
名称:程序媛想事儿
功能介绍:媛媛的主题包括技术蛋糕(包括IT最新资讯、C/C++/Java等编程语言知识及有关算法探讨等IT资料)、生活指南、轻松一刻三个栏目,每天会推送这三个方面的信息给大家,让猿媛们在学习IT知识的同时能关注生活关注健康,同时还能轻松开怀一笑。同时,大家可以回复关键词定制自己想要的信息,如只看C/C++相关资料、只看Java相关资料、只看生活指南或只想开怀一笑都是可以的,后期会根据需要开设疑难解惑等其它平台,欢迎大家加入学习!!!
作者:Alexia(minmin)
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】
如果您希望与我交流互动,欢迎微博互粉
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接
否则保留追究法律责任的权利
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:186045次
积分:2627
积分:2627
排名:第8478名
原创:60篇
转载:67篇
评论:47条
(1)(1)(4)(1)(1)(1)(1)(2)(1)(1)(1)(2)(9)(2)(1)(1)(1)(6)(3)(1)(1)(3)(1)(2)(2)(1)(4)(1)(1)(1)(2)(1)(5)(5)(3)(9)(4)(5)(3)(15)(13)(4)

我要回帖

更多关于 c语言知识点 的文章

 

随机推荐