c/c++学习笔记

来源:互联网 发布:matlab约束粒子群算法 编辑:程序博客网 时间:2024/04/30 13:27
1. 在c/c++中,指针非常灵活,但也非常容易出错, 如果再跟数组联系起来,出错的可能性更大。

例如:
int *p[10]; 这是指针数组,有p[0] ~ p[9] 10个指针,所以sizeof(p) = 40。

int (*p)[10]; 这是指向数组的指针,sizeof(p) = 4。

例如:
int (*p)[10]; //one pointer which points to an array
int b[][10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};                 
p = b;
此时,除了p是一个变量,b是地址常量的区别外,p跟b的用法是一样的。

2. 另外一个容易让人犯错的就是const指针和指向const对象的指针。

const指针(在g++编译器下,需要对const指针初始化)
例如: int a = 0; int b = 9;int *const p = &a;
初始化后,const指针就不能指向其它地址,任何对它的重新赋值都会编译不过的,如: p = &b; //compile error

指向const对象的指针
例如: int a = 0; int b = 9;int const *p;
指向const对象的指针可以不初始化, 也可以对它多次赋值。但一旦它指向某个对象后,任何通过这个指针来改变对象值都是徒劳的。即如果 p = &a, 那么*(p) = 1; //compile error

两个组合起来就是指向const对象的const指针
const int a = 0; const int const *p = &a;

3. 指针跟引用很相象,但其实差别还是挺大的。(注意:引用是c++才引进来的一个概念,标准c里面没有)
   简单地说,引用必须初始化,且初始化后,不能再指向其它的对象。
   下面这两种情况必须使用引用。(为什么?)
   (1)流操作符<<和>>、赋值操作符=的返回值
   (2)拷贝构造函数的参数、赋值操作符=的参数

4. static关键字
   对于面向过程的c语言来说,static主要是用来修饰变量,当然也可以修饰函数。
  (1) 在函数体内,用static修饰的变量,在函数调用过程中,值保持不变,也就是说,它存放在静态数据区中,生存周期  跟全局变量一样。

(2) 在函数体外,用static修饰的全局变量,限定了它的作用域,使之不能扩展,也就是说在工程内,只有本文件可见,在工程内其它文件用extern调用是不行的。

(3)修饰函数,static函数只能在本文件调用,跟extern相对应。

对于面向对象的c++来说,static关键字还有另外一个作用。那就是作为类的静态数据成员,它为类的所有对象所共享。