指针&函数&数组&const

C语言中指针,函数,数组,const变量,单独来说,大家都不陌生.
但是,几个简单的事物组合起来,往往会生成奇异的变化。

<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
Type help' 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,419评论 3 44
  • 1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧...
    金巴多阅读 1,715评论 0 9
  • 题目类型 a.C++与C差异(1-18) 1.C和C++中struct有什么区别? C没有Protection行为...
    阿面a阅读 7,618评论 0 10
  • 你说你会陪着我到秋日昏落 我慢慢的等待秋日的到来 重逢着秋日的尾巴 我想我能抓住的也就只有秋天的尾巴 可不曾想 那...
    淡墨幽兰阅读 153评论 3 5
  • 作者: Sally 随着兩岸三地近年创业风潮兴起,越来越多育成中心及共创空间出现。Google从车库发迹,而硅谷的...
    创新拿铁阅读 957评论 0 0