c问题

一:二重指针的使用:

1. 剑指offer: page 49 :

往链表结尾增加一个节点,使用了 二重指针。

使用的原因:如果头节点为空,那么就需要改变头结点的指针,增加的节点就是头节点,如果不是用二重指针,phead 仍然为null.

2. 对空指针的理解。

有时,在程序中需要使用这样一种指针,它并不指向任何对象,这种指针被称空指针的值是NULL,NULL是在<stddef.h>中定义的一个宏,它的值和任何有效指针的值都不同。NULL是一个纯粹的零,它可能会被强制转换成void*或char*类型。即NULL可能是0,0L或(void*)0等。有些程序员,尤其是C++程序员,更喜欢用0来代替NULL。
    指针的值不能是整型值?,但空指针是个例外,即空指针的值可以是一个纯粹的零(空指针的值并不必须是一个纯粹的零,但这个值是唯一有用的值。在编译时产生的任意一个表达式,只要它是零,就可以作为空指针的值。在程序运行时,最好不要出现一个为零的整型变量)。

空指针常量

对于空指针值,一般的文档中倾向于用 NULL 表示,而没有直接说成 0。但是我们应该清楚:对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 “null pointer”(空指针)。一句话, 空指针是什么,就是一个被赋值为0的指针,在没有被具体初始化之前,其值为0.
在us/os中普遍的用到了,对指针是否为空指针的判断,而没有把C语言中其中的语法知识讲解出来,很多同学对此理解有些含糊,趁着有时间,把其中的一些疑问及解答列举如下。若有错误请指正。
问题一: 什么是空指针常量(null pointer constant)?
An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. (一个表示0值的 整数常量,叫做空指针常量)
解释: 0、0L 、3 - 3(它们都是“integer constant expression”整数常量 表达式)以及 (void*)0 等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)。
至于系统选取哪种形式作为空指针常量使用,则是实现相关的。
一般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L);
问题二: 什么是空指针(null pointer)?
If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function. ( 如果一个 空指针常量 赋给了一个有类型的 指针变量,那么这个指针就叫空指针。它不指向任何的对象或者函数)
解释:如果 p 是一个 指针变量
若进行: p = 0;、p = 0L;、p = '\0';、p = 3 - 3;、p = 0 * 17; 中的任何一种 赋值操作之后(对于 C 来说还可以是 p = (void*)0;)
p 都成为一个空指针,并且由系统保证空指针不指向任何实际的对象或者函数。 反过来说,任何对象或者函数的地址都不可能是空指针。
问题三: 什么是 NULL?
The macro( 宏)NULL is defined in <stddef.h> (and other headers) as a null pointer constant (NULL作为一个 宏定义为一个空指针常量)
即 NULL 是一个标准规定的 宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。
有些系统中这样来宏定义的
#define NULL 0
char *p = NULL;
问题四:空指针(null pointer)指向了内存的什么地方即空指针的内部实现?
标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值(0x0 地址还是某一特定地址)表示空指针取决于系统的实现。我们 常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),具体请参见 C FAQ。
在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了—— 编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示——如上所述,有时它们是不同的。
问题5: 在实际的操作中 如何判断某个指针是不是空指针?
可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。
指针变量 p 是空指针的判断: (假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针)
if ( p == 0 )
if ( p == '\0' )
if ( p == 3 - 3 )
if ( p == NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */
if ( NULL == p )
if ( !p )
if ( p == q )
问题6: 可以定义自己的 NULL 的实现吗?
解释:If the program declares or defines an identifier in a context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved identifier as a macro name, the behavior is undefined.( NULL 是标准库中的一个符合上述条件的 reserved identifier (保留标识符)。所以,如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的
问题7:malloc 函数在分配内存失败时返回 0 还是 NULL?
解释: malloc 函数是标准 C 规定的 库函数。在标准中明确规定了在其 内存分配失败时返回的是一个 “null pointer”(空指针):
If the space cannot be allocated, a null pointer is returned.
它指向系统内存具体哪个地方是由系统决定的,应用者不必去深究。
二:sizeof问题
1.http://blog.csdn.net/xiajun07061225/article/details/6827643 点击打开链接
2.sizeof 百度百科
三:LPC1788 计时器计数减1

利用LPC1788的定时器0实现10ms单位的计数器,即每10ms计数增加1.

  

初始化定时器0 

init_timer(1,599990); //10ms为单位 599990=10(60000000/1000-1),LPC1788工作在120MHZ,经PLL分频后的外设时钟PeripheralClock为60MHZ

函数原型:

  1. uint32_t init_timer ( uint8_t timer_num, uint32_t TimerInterval )   
  2. {  
  3.   
  4.     timer0_counter = 0;  
  5.     LPC_SC->PCONP |= (0x01<<1);  
  6.     LPC_TIM0->MR0 = TimerInterval;  
  7.     LPC_TIM0->MCR = 3;               /* Interrupt and Reset on MR0 */  
  8.     NVIC_EnableIRQ(TIMER0_IRQn);  
  9.     return (TRUE);  
  10. }  


使能定时器

  1. LPC_TIM0->TCR = 1;  

定时中断处理

  1. void TIMER0_IRQHandler (void)   
  2. {    
  3.   LPC_TIM0->IR = 0x1<<0;       /* clear interrupt flag */  
  4.   timer0_counter++;  
  5.   return;  
  6. }  
四、float  double int  long 之间转换。
如:int debut =7.2e12   debut 的值可能是多少?
float 的有效位是6位?
c++ primer 第四版 的课后题
有一个大数存到int里, 这个int 变量存的值是多少?




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值