凌动魅力

Tag: C

C语言新手误区

个人踩坑总结,以下内容不一定完全原创。不定期更新。

scanf读入字符的问题

新手常常忘记变量前的取地址符“&”,而编译器又不会报错,如果代码没问题运行又出错,一定记得检查读入,因为在逻辑上,前提正确并且过程正确,则结论一定正确,如果结论错误,则要么是前提出问题,要么是过程出问题。C语言作为强类型语言,读入和输出都比其他类型如Python麻烦许多,不仅要区分整型、浮点型、字符、字符串,又要注意读入之后清空缓冲区,还要区分scanf与getchar/getch/getche/gets的区别。这里推荐2篇文章

C语言中scanf函数与空格回车

结合缓冲区谈谈C语言getchar()、getche()、getch()的区别

指针的初始化与赋值

先要弄明白两个符号“*”和“&”,前者名叫 间接运算符,后者名叫 取地址符,间接运算符有3个作用

int *p; //声明一个指针
int x=2*3; //乘号
*P=2;//取得p指针对应的数值,不加*号的p表示的是地址

指针在初始化的时候=的右边只能是地址,唯一例外的是

int *p=0;  //表示指针为空,而不是赋值为0

指针的赋值必须要注意 = 号两边的类型必须一致,比如

int *p,a=25,b[]={1,2,3};
//地址赋给地址
p=b;
p=&a;
//数值赋给数值
*p=a;
*p=b[0];

至于字符串指针,在初始化的时候是

int *p="this is a pointer";

刚不是说初始化时=号右边必须是地址吗?对,话没错,所以这里实际是把p指针指向了”this is a pointer”这句话的地址;sizeof(p)时就会发现端倪,p的大小是char类型的大小,而不是”this is a pointer”这句话的大小。另外,这条语句实际隐含了 const,也就是说

//这两句话完全一致
int *p="this is a pointer";
const int *p="this is a pointer";

因而,无法修改”this is a pointer”这句话,但p可以重新指向。

p[]="01234";//这时就可以通过p[下标]修改字符串的内容了

单引号与双引号的区别

区别很简单,使用单引号时是字符,而使用双引号时是字符串。

char a='abcde'//编译器会报错,字符不能超过4位
char a="abcdefg";//正常

另外值得注意的是,字符printf时对应%c,字符串对应%s;

 

倒数第226天

之前学得好好的,直到今天在《C语言程序设计精髓》里刷题的时候才注意到C语言里有这么多细节……

初步接触深度优先搜索算法,还在琢磨。看《啊哈!算法》时对书中给的实例不太满意,效率不高,但考虑到是教初学者用的就释然了,写工业级的算法俺们也看不懂~

积累词汇1982个。

倒数第255天

《C程序设计语言》,学完了指针与函数,嗯,还是懵懵懂懂。接下来是结构。

晚上没睡好,想到了父亲。

完成词汇1045个。

Copyright © 2017 凌动魅力

蜀ICP备15003767号-1 Up ↑