码迷,mamicode.com
首页 > 编程语言 > 详细

C语言相关

时间:2017-10-08 21:24:33      阅读:238      评论:0      收藏:0      [点我收藏+]

标签: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

 

C语言相关

标签:style   改变   new   注意   rom   寄存器   func   循环   eof   

原文地址:http://www.cnblogs.com/xuwangzihao/p/7638485.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!