CSDN在线讲堂-》玩转C指针 学习笔记

                                                        玩转C指针

         前段时间听了CSDN在线讲堂的嵌入式C学习关于指针的课,下面是我的学习笔记,记下了我认为比较重要的知识点,笔记并不全面,就算是学习的tips。

1.看下面的代码:

 

 

这两种定义方式是有区别的。

        第一种的情况是,在编译之前,编译器用int*替代代码中的INT_T,所以INT_T p1,p2;相当于int* p1,p2;所以p1为指向int型的指针,p2为int型变量。

        第二种情况,typedef将int*定义为一种类型,叫int_t,所以q1、q2都为指向int型的指针。

引深:

        在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。

        typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。

2.编程建议:

所有自定义的类型(如用typedef定义的类型)的名字加_t后缀,便于程序阅读。

 

3.看下面代码:

 

        这段代码编译能够通过,但会引发段错误。原因在于,**p指向了未知的内存空间,造成了段错误。**p为二级指针,它存储指针*p的地址,*p指向int型变量a。但此处*p并没有声明或定义,所以是未知的、不可访问的内存空间,而**p指向了它,造成了段错误。

       指针必须指向可访问、已知的内存空间。

上面的代码改成下面的就正确了:

 

        在实际的编程中一定要注意这样的问题,确保指针指向可访问、已知的内存空间,否则会造成不易察觉的错误。

3.函数的接口要保持稳定。

4.在C语言中直接改变函数的参数的值对调用者来说是无效的。若需要改变形参的值,指针便会派上用场,或C++中的引用。

引深:      

        C语言中函数调用机制决定了直接改变参数的值对调用者无效。因为调用函数会开辟新的空间,在调用函数内声明定义的变量仅在此函数内有效,当函数调用结束时编译器自动释放了这段空间。而此函数的形参仅仅是调用者传递的实参的副本,对副本值的改变不会影响到调用者中实参的值。在C语言中,参数相当于局部变量。如果使用指针传递,则调用函数中的形参是要改变值的对象的地址的副本,对此副本指向空间的内容的改变将影响到调用者中对象的值。C++中的引用是指向变量的别名,注意其与指针的区别。

5.看下面的代码:

 

      此代码片段是错误的。根据上面说的函数的调用机制,变量b为局部变量,其内存空间在函数调用完之后便被编译器释放了,所以返回的地址指向了未知、不可访问的内存空间,造成段错误。

引深:

        函数可以返回全局变量指针、静态变量指针、malloc分配的内存块的指针,不可以返回局部变量的指针。

6.看以下代码:

 

指针变量累增,累增的字节数为其所指向对象占用空间的大小。

 

7.看下面的代码:

 

        啊,ubuntu下的画图软件openoffice.org图画不能保存为jpg文件,只好自己说了。在内存空间中,a占用4字节,char为1字节,short为2字节。在第一个输出中,将&a强制转换为指向char类型的指针,所以只显示&a指向地址后1字节中的内容,即78.同理,第二个输出为5678。第三个自然是12345678.此例说明了指针必须指定其指向变量类型的意义。

 

8.检验系统默认为大端法还是小端法的函数

 

 

返回值中使用了逻辑表达式,非常的简洁。

 

 

 

 


 

希望上述的笔记对大家有帮助。

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值