指针-C语言

1、
int a
int *a
int **a
int a[10]
int *a[10]
int (* a)(int)                      or            typedef int (* F)(int); F a;F d[10];
int (* a[10])(int)
函数指针是比较难的,可linux源码中到处是,必须掌握。

2、static的特性
a 函数中的static变量是静态变量,无论这个函数被调用几次它都只有一份,也就是只对这一份进行修改。它的生命周期是程序的周期。
b 当static变量是全局变量时,它只能被本文件中的函数调用。不存在与其他文件中的变量命名冲突的问题。当是static函数时,它只能被本文件的函数调用。

3、const的特性
表明声明的变量是常量
特别容易弄混的是
const int *p和int * const a
前者意味着p所指向整型的数是不能变的,例如 int a=3;const int *p=&a;再*p=5;就不允许了
后者意味着p本身所指的地址不能变了,就如同数组一样,是常量指针
例如 const int *p=&a; 再p=p+1;就不允许了.《转载》

我的记法是const在int前,值就不能改。

4、volatile的特性
这一段也是转载,呵呵,自己讲不清,看高手的。
恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码:

  1. int i1;              int geti1() {return i1;}
  2. volatile int i2;  int geti2() {return i2;}
  3. int i3;              synchronized int geti3() {return i3;}

  geti1()得到存储在当前线程中i1的数值。多个线程有多个i1变量拷贝,而且这些i1之间可以互不相同。换句话说,另一个线程可能已经改变了它线程内的i1值,而这个值可以和当前线程中的i1值不相同。事实上,Java有个思想叫“主”内存区域,这里存放了变量目前的“准确值”。每个线程可以有它自己的变量拷贝,而这个变量拷贝值可以和“主”内存区域里存放的不同。因此实际上存在一种可能:“主”内存区域里的i1值是1,线程1里的i1值是2,线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值,而且这个改变还没来得及传递给“主”内存区域或其他线程时就会发生。
  而geti2()得到的是“主”内存区域的i2数值。用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。换句话说,一个变量经volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。
  既然volatile关键字已经实现了线程间数据同步,又要synchronized干什么呢?呵呵,它们之间有两点不同。首先,synchronized获得并释放监视器——如果两个线程使用了同一个对象锁,监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事实。但是,synchronized也同步内存:事实上,synchronized在“主”内存区域同步整个线程的内存。因此,执行geti3()方法做了如下几步:
1. 线程请求获得监视this对象的对象锁(假设未被锁,否则线程等待直到锁释放)
2. 线程内存的数据被消除,从“主”内存区域中读入(Java虚拟机能优化此步。。。[后面的不知道怎么表达,汗])
3. 代码块被执行
4. 对于变量的任何改变现在可以安全地写到“主”内存区域中(不过geti3()方法不会改变变量值)
5. 线程释放监视this对象的对象锁
  因此volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。

5
#define BIT3 (0x1 << 3)
a |= BIT3
a &= ~BIT3
这个操作在设置文件权限中很有用

6
int *ptr
ptr = (int *)0x6709
*ptr = 0xaa55
但在有些平台似乎有对齐问题

7 unsigned int a=5;int b=-7;printf(a+b);问打印什么?
无符号数加有符号数,有符号数会转化成一个很大的无符号数。


8 int a=5,b=6,c;c=a+++b;问c?
先做a+b,再做a++,最后c=11。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值