用static声明局部变量:有时希望函数中的局部变量的值在函数调用结束后不消失而表留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。这时就应该指定该局部变量为“静态局部变量”,用关键字static进行声明。
用static声明外部变量:有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加一个static声明。这种加上static声明、只能用于本文件的外部变量称为静态外部变量。在程序设计中,常由若干人分别完成各个模块,各人可以独立地在其设计的文件中使用相同的外部变量名而互不相干。只需在每个文件中的外部变量前加上static即可。这就为程序的模块化、通用性提供方便。如果其他文件不需要引用本文件的外部变量,可以对本文件中的外部变量都加上static,成为静态外部变量,以免被其他文件误用。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void swap(int *p1,int *p2)
{
int *temp;
*temp = *p1;
*p1 = *p2;
*p2 = *temp;
}
对于上面的程序代码,*p1就是a,是整型变量。而*temp是指针变量temp所指向的变量。但temp中并无确定的值(它的值是不可预见的),因此temp所指向的单元也是不可预见的。所以,对*temp赋值有可能给一个存储着重要数据的存储单元赋值,这样就会破坏系统的正常工作状况。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
多维数组与指针
前已述及,a[0]和*(a+0)等价,a[1]和*(a+1)等价,a[i]和*(a+i)等价。因此,a[0]+1和*(a+0)+1都是&a[0][1]。a[1]+2和*(a+1)+2的值都是&a[1][2]。
务请记住*(a+i)和a[i]是等价的。
-----------------------------------------------------------------------------------------------------------------
表示形式 | 含义 | 地址
------------------------------------------------------------------------------------------------------------------
a | 二维数组名,指向一维数组a[0],即0行首地址 | 2000
------------------------------------------------------------------------------------------------------------------
a[0],*(a+0),*a | 0行0列元素地址 | 2000
------------------------------------------------------------------------------------------------------------------
a+1, &a[1] | 1行首地址 | 2008
------------------------------------------------------------------------------------------------------------------
a[1], *(a+1) | 1行0列元素a[1][0]的地址 | 2008
------------------------------------------------------------------------------------------------------------------
a[1]+2,*(a+1)+2, |
&a[1][2] | 1行2列元素a[1][2]的地址 | 2012
------------------------------------------------------------------------------------------------------------------
*(a[1]+2),*(*(a+1)+2), |
a[1][2] | 1行2列元素a[1][2]的值 | 元素值为13
------------------------------------------------------------------------------------------------------------------
在指向行的指针前面加一个*,就转换为指向列的指针。例如,a和a+1是指向行的指针,在它们前面加一个*就是*a 和 *(a+1),它们就成为指向列的指针,分别指向a 数组 0 行 0 列的元素和 1 行0 列的元素。反之,在指向列的指针前面加&,就成为指向行的指针。例如a[0]是指向0行0列元素的指针,在它前面加一个&,得&a[0],由于a[0]与*(a+0)等价,因此&a[0]与&*a等价,也就是与a等价,它指向二维数组的0行。
char *string;
string = "alsd";
由上可以看到string被定义为一个指针变量,指向字符型数据,请注意它只能指向一个字符变量或其他字符类型数据,不能同时指向多个字符数据,更不能把字符“alsd”存放到string中(指针变量只能存放地址),也不是把字符串赋给*string。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
指向函数的指针:
赋值语句“p = max;”的作用是将函数max的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表函数的入口地址。这时,p就是指向函数max的指针变量,此时p和max都指向函数的开头。调用*p就是调用函数max函数。