标签:style 改变 new 注意 rom 寄存器 func 循环 eof
变量必须定义在函数开头(尤其注意for循环。。。)
变量的存在性(可见性)遵循内部优先原则(如果程序块内外都定义了,则外部被屏蔽),从被定义的地方到程序块结束都可见,不会因为存储类别而有异议(static只改变生命周期,不改变可见性)。
按照生存周期,变量可以分为
静态存储
-静态局部变量(程序块内有效)(static)
-静态外部变量(本文件内有效)(定义在全局)
-外部变量(用 extern 声明后,其他文件也可以引用)(extern)
动态存储
-自动变量(程序块内有效)(缺省或者auto)
-寄存器变量(程序块内有效)(register(不过编译器会优化,现在很少自己定义))
-形式参数(程序块内有效)
我们都知道一维数组的时候,数组名字指代数组第一个元素的地址,类似于一个指针。
比如,定义int a[10]; 我们就知道 a==&a[0]; *(a+i)==a[i]; a类似于一个指向int的指针变量,a+1在地址上实际是a+1*sizeof(int)。
同理,定义完int a[10][10]; 我们就知道 a==&a[0]; a[0]==&a[0][0].
a[0]类似于一个指向int的指针变量,a[0]+1在地址上实际是a[0]+1*sizeof(int)。
a类似于一个指向"整个"int[10]的指针变量,a+1在地址上实际是a+1*10*sizeof(int)。
这里不容易理解的地方在于,a[i]在数学上是存在且有数字的,他的值就是:&a[i][0],同时也是:*(a+i);但是在物理上却是不存在的。
*(a+i)的实际意义,其实不是“指针变量a[i]”,而是以a[i]起头的一维数组“a[i][0]...a[i][9]”的首地址。
这是由“数组的定义”定义的,所以说a类似于一个指向指针的指针,但是实际上并不是,它是一个数组的一部分,就是数组的首地址。不要完全按照指针去理解。
当然,指向指针的指针也可以定义二维数组。
int** a; a=new int*[n]; for(int i=0;i<n;i++) a[i]=new int[m];
这里的每个*(a+i)就是有物理存储的了。和数组的区别在于:
1,多了n个变量来存放二级指针。(缺点)
2,可以不连续存储。(优点)
int * p; //指向int的指针
int * p[4]; //指针数组,4个指向int数据的指针
int (*p)[4]; //指向int数组的指针
int * p(); //返回“指向一个int数据的指针”的函数
int (*p)(); //指向函数的指针,返回值为int
int **p; //指向“指向int数据的指针”的指针
void *p; //指向不确定数据类型的数据的指针(类型由计算机自动转换)
动态申请回收资源:
void * mallac(unsigned int size);
void * calloc(unsigned n,unsigned size);
void free(void * p); //p cames from the last calloc or mallac function.
void * realloc(void * p,unsigned int size); //resize
标签:style 改变 new 注意 rom 寄存器 func 循环 eof
原文地址:http://www.cnblogs.com/xuwangzihao/p/7638485.html