因为考研需要,细读严蔚华版的《数据结构》——数据结构经典教材,对C语言生疏和对指针恐惧的缘故,这书真是“不忍卒读”,一把辛酸泪,于是决定好好巩固C基础和指针。
向他人咨询了一下C指针的经典书籍,大致有《c陷阱与缺陷》 《c专家编程》 《征服c指针》 《c与指针》这么几本,高中同学(南大CSer班花,班花!)推荐一网站:http://learn.akae.cn/media/index.html(Linux C编程一站式学习)。好吧,这些我一本都没看,因为学校图书馆好像都没购进或是已经被借出,好不容易找到了本《指针的编程艺术》(人民邮电出版社),虽不是专讲C,不过倒也凑合,毕竟C占了三成多。
花了几个晚上,把C指针部分仔仔细细地研究了一番,现在算是搞定了,突然发现对C指针有了与以往不同的看法——有恐惧变为欣赏,其数据处理能力实在是强悍!
记一些对本人比较重要的知识点,希望以后回头看看能温故而知新吧:
- int *p1 = &i 和int *p1;p1 = &i是相同的,所以要当心。
- 输入数据的时候,对于int等类型的变量,需要用取地址符 & ,而对于数组等指针类型的变量,是不需要的(个人觉得是因为指针这类东西本身就是存储的地址,可以直接映射)。
- 对于二维数组(指针),输出数据时一定要有2个[],2个**或者1个[]和*;对于 temp[][]这样的数组,temp+1表示的是 temp[1],其地址与temp[1][0] 相同(都是第二行第一个的地址),但意义却不同:直接输出temp[0],输出的是第二行第一个的地址,如果是char数组的话,就输出string串。
- 有int *p1,则int *p2 = p1和int **p2 = &p1是不同的,前者表示指针p2被赋值为p1所指向地址,后者表示指针p2指向p1地址。
- p2=*&p1 与p2=&*p1,前者p2是变量,取的p1所指位置的值,后者表示表示给相同类型的指针p2=p1.
- 对于char *name这样的,不可以用scanf函数来输入,因为它是个指针变量,目前没指向任何内存(除非用了malloc或clloc);对于char firstname[20],这样的,不可以直接赋值,因为它是个指针常量
-
常量指针:const int *p;int const *p; 指针常量:常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改
- 指针常量:int *const b = &a; //const放在指针声明操作符(*)的右侧,因为指针常量是一个常量,在声明的时候一定要给它赋初始值。一旦赋值,以后这个常量再也不能指向别的地址,但是通过*b来对a进行修改。
- 指针函数:int *(int)这是指针函数的声明,这是函数,返回int型指针
- int (*pf)int 这是函数指针,是可以指向函数的指针。有别于指针函数。
主要还是指针与数组一块比较艰深,这块得花大半时间研究,否则很容易被指针戳得晕头转向。