C语言中指针,函数,数组,const变量,单独来说,大家都不陌生.
但是,几个简单的事物组合起来,往往会生成奇异的变化。
- 基础介绍
- 指针是什么
- 函数是什么
- 数组是什么
- 所谓const
- 函数指针和指针数组
- 函数指针
- 指针数组
- 数组指针和指针数组
- 数组指针
- 指针数组
- 常量指针和指针常量
- 常量指针
- 指针常量
- Linux下声明解释器
- 终端下的使用
- 终端下的安装
<h4 id="start">基础介绍</h4>
<h5 id="start_pointer">指针是什么?</h5>指针就是一个变量,它存储着指向变量的地址
<h5 id="start_function">函数是什么?</h5>
函数就是一个有着形参(可选),有着返回值(可选),有着名字(函数名)的代码块,这个代码块根据我们的需求实现了一定的功能,例如:
<pre>
int max(int a, int b) {
if(a > b)
return a;
return b;
}
</pre>
一些说明:
这里max()就是一个函数
返回值:一个int型的变量
形参:两个int类型的变量
函数名:max
功能:获取两个整形变量中最大值
<h5 id="start_array"> 数组是什么?</h5>数组就是一个变量。这个变量可以存储指定数量,指定类型的值。例如:
<pre>
int a[3];//定义了一个名字为a,可以容纳3个整形值的数组(整型数组)
char c[15];//定义了一个名字为c,可以容纳15个字符的数组(字符数组)
</pre>
<h5 id="start_const">所谓const</h5>const可以看做constant的缩写,就是声明一个常量,也就是只能读,不能改变,例如:
<pre>
int const a=2; //a此时是一个整形常量,它的值为2,只能读取,不能改变
a=3; //Error,编译时,编译器会报错
</pre>嗯,貌似看起来很简单,应该可以一气呵成吧
确实是这样的,但是实际应用的时候,我们往往组合起来使用:
- 函数指针,指针函数
- 数组指针,指针数组
- 常量指针,指针常量
<h4 id="com_func"> 函数指针和指针函数</h4>
<h5 id="func_pointer">函数指针</h5>首先它是一个指针,然后,它指向一个函数,例如:
int (*p)(int, int);
//这样,我们就定义了一个函数指针
//它指向返回值为int,参数为两个int的函数
我们可以这样使用它:
p=max; //把max函数地址赋给p
p=&max; //把max函数地址赋给p
/*这两种方法都是okay的,有点疑惑是吧,待会解释*/
定义一个整型变量,用来存储最大值:
int max_value;
正常函数调用:
max_value = max(2, 5);
好咯,我们开始使用函数指针:
max_value = p(2, 5); //就像函数调用[max(2,5))]一样使用它
max_value = (*p)(2, 5); //推荐的函数指针使用方法,与函数调用形成区别
好了,开始解释疑惑啦,你可能很纳闷为什么p=max和p=&max效果一样?
max是函数名,当max参与函数调用,或者直接赋值给函数指针时,它会自动转化成>函数指针常量;
而当你使用取地址符时,编译器会把它当作函数名,取出该函数的地址。
<h5 id="pointer_func">指针函数</h5>啊,不要被吓到哦,它就是一个返回值为指针的函数
呵呵,是不是too simple了?
也举个例子吧:
char *get_my_name(); //这就是一个指针函数
<h4 id="com_array"> 数组指针和指针数组</h4>
<h5 id="arr_pointer">数组指针</h5>指向数组的指针变量
<h5 id="pointer_arr">指针数组</h5>一个数组,数组的元素是指针
来个例子吧:
int (*arr1)[5]; //数组指针,指向一个数组容量为5的整形数组
int *arr2[5]; //指针数组,一个可以容纳5个整形变量的数组
定义一个二维数组吧:
int arr[3][5]; //一个行为3,列为5的整型数组
//其实,也可以看做有着一个容量为3一维数组,
//只是这个容量为3的一维数组的每一个元素都是一个容量为5的一位数组
二维数组指针和二维数组:
arr1=arr[2];
那么,arr1[i] == arr[2][i]
还有一点需要注意的
arr1 = arr1+1;
//此时,arr1[i] == arr[3][i],也就是指针向后移动了1*5*sizeof(int)个字节
<h4 id="com_const"> 常量指针和指针常量<h4>
<h5 id="const_pointer"> 常量指针</h5>一个指向常量的指针
也就是说这个指针指向的值不能改变
例如:
int zz=5;
int const * p=&zz; .//常量指针
*p = 6; //Error:向只读位置‘*p’赋值,编译器会报错
但是
int d=4;
p = &d; //重新指向另一个指针
总的来说:常量指针指向的变量的值不能通过长里常量指针改变,但是常量指针的值却是可以改变的,即指向的位置可以改变。
<h5 id="pointer_const">指针常量</h5>也是一个指针,不过其指针不能改变,但是指针指向的值可以改变。
你可以与常量指针对比来着
例如:
int * const pp=&zz; //指针常量,指向整型变量zz
*pp = 1124; //zz的值被改变,变为1124
pp=&d; //Error:向只读变量‘p’赋值, 编译器报错
由此可见,指针常量使指针本身不变,但不影响其所指向的变量值的变化
哦,还有比较重要的事儿,指针常量在定义时就必须初始化哦,你可以试试。
<h4 id="cdecl"> Linux下的cdecl工具</h4>
<h5 id="use">终端下的使用</h5>通过这个工具,我们很容易知道声明为何,
以下在linux下终端下输入,例如:
mwumli@mwumli-K43SA:~$ cdecl
Typehelp' or
?' for help
cdecl> explain int *zz;
declare zz as pointer to int
cdecl> explain int (zz)(int);
declare zz as pointer to function (int) returning pointer to int
cdecl> quit
<h5 id="apt_get">终端下的安装</h5>这个工具在ubuntu中没内置,故痛过以下命令安装:
sudo apt-get install cdecl
网友评论