By francis_hao Oct 31,2016

指针数组和数组指针

指针数组本身是个数组,数组的内容是指针。形如char *pa[]。由于[]优先级高于*,pa先于[]结合表示pa是一个数组,pa[]再与*结合表示pa[]是指针。比如pa[0]放了一个指针。

数组指针本身是个指针,指针指向的是数组。形如char (*ap)[6]。ap与*结合表示ap是个指针,(*ap)再和[6]结合表示(*ap)是个数组名,含有6个元素,可以把(*ap)[6]想成a[6],那么可以把(*ap)看成数组首地址a,而ap就是指向一个含有6个元素的数组的指针。

#include <stdio.h>
int main(void)
{
    int aa[2][6]={{1,2,3,4,5,6},{7,8,9,10,11,12}};
    int
(*pa)[6];
    pa = aa;
    //pa=&aa[0]; /*这样也是可以的*/
    printf("%d\n",*(*pa+1));
    printf("%d\n",**(pa+1));
    return
0;
}

 

 

指针常量和常量指针

首先共同点是他俩都是指针,只不过侧重点不同,放在前面的就是侧重的。

指针常量侧重于指针,说明指针本身是一个常量性质的,也就是说指针的值是不能改变的,指针常量的形式如:int *const a; 英语读作a const point to int。const放在谁后面就是修饰谁,说明*是const的,不能被修改,如下所示

#include <stdio.h>
int main(void)
{
    int
*const cp;

    int aa;

    cp =
&aa;
/* 错误的,不能在除初始化处对cp进行赋值 */
    return
0;
}

 

只能在定义处赋初值

#include <stdio.h>
int main(void)
{
    int aa;

    int
*const cp =
&aa;
/* 正确的,只能在此处赋值 */
    return
0;
}

常量指针侧重于常量,说明指针指向的内容是常量,指针本身可以改变但是指向的内容不能改变,形式如:const int *a;或者int const *a;
英语读作a point to const int,记住,还是const在谁后面就修饰谁,如果在最前面就后移一位。

#include <stdio.h>
int main(void)
{
    int aa;

    const
int
*p;

    aa =
1;
    p =
&aa;
    aa =
2;
    *p =
3;
/* 错误的,不能对*p赋值 */
    return
0;
}

在上例中,并不是说aa所在地址的值不能改变了,只是不能通过指针p进行改变,更多的是向编译器进行的说明。

 

指针函数和函数指针

指针函数本身是个函数,具有一个指针类型的返回值.

函数指针本身是个指针,指向一个函数

函数指针由返回值确定类型,和参数无关,下面两段代码展示了这种特性

#include <stdio.h>
int fun1()
{
    printf("fun1 without parameter but return int\n");
    return
0;
}
int fun2(char
*a)
{
    printf("fun2 with parameter %s and return int\n",a);
    return
0;
}
void fun3(char
*a)
{
    printf("fun3 with paramete %s but has no return value \n",a);
}
int main(void)
{
    int
(*pf)();

    pf=fun1;
    (*pf)();

    pf=fun2;
    (*pf)("sencond");

    pf=fun3;
    (*pf)("third");
    return
0;
}

只与返回值有关

#include <stdio.h>
int fun1()
{
    printf("fun1 without parameter but return int\n");
    return
0;
}
int fun2(char
*a)
{
    printf("fun2 with parameter %s and return int\n",a);
    return
0;
}
void fun3(char
*a)
{
    printf("fun3 with paramete %s but has no return value \n",a);
}
int main(void)
{
    int
(*pf)();/*可以不考虑形参类型*/
    void
(*ff)();

    pf=fun1;
    (*pf)();

    pf=fun2;
    (*pf)("sencond");

    ff=fun3;
    (*ff)("third");
    return
0;
}

 


本文由
刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/6017894.html

 

参考

【1】 K&R C程序设计语言

 

 

 

 

 

 

C语言指针大杂烩的更多相关文章

  1. C语言指针转换为intptr_t类型

    1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...

  2. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  3. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

  4. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

  5. (转载)c语言指针学习

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  6. 关于C语言指针的问题

    在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  7. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  8. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

  9. C语言指针操作

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...

随机推荐

  1. SQL语句笔记/好记性不如烂笔头/持续更新

    常用的增删改查操作,针对库,表,字段,记录分类有助于记忆,当然熟能生巧,还是需要多多实操 库操作 删除库 drop database dbx; 列出所有库 show databases; 切换库 us ...

  2. 网站title标题被改并被百度网址安全中心提醒的解决办法

    国庆假日期间我们Sine安全接到众多网站站长求助网站标题被改导致在百度搜索中百度安全中心提醒被拦截,导致网站正常用户无法浏览网站被跳转到一些菠菜du博网站,而且很明显的一个特征就是在百度中搜索关键词的 ...

  3. 003---socket介绍

    socket介绍 什么是socket? socket是应用层与tcp/ip协议族通信的中间软件抽象层,它是一组接口.在设计模式中.其实就是一个门面模式.我们无需深入理解tcp/udp协议,socket ...

  4. Python3 模块、包调用&路径

    ''' 以下代码均为讲解,不能实际操作 ''' ''' 博客园 Infi_chu ''' ''' 模块的优点: 1.高可维护性 2.可以大大减少编写的代码量 模块一共有三种: 1.Python标准库 ...

  5. R语言学习笔记(八):零碎知识点(16-20)

    16--complete.cases( ) complete.case()可以判断对象中是否数据完全,然后返回TRUE, FALSE 这一函数在去除数据框中缺失值时很有用. > d kids a ...

  6. hdu 1394 Minimum Inversion Number(线段树)

    参考:http://blog.sina.com.cn/s/blog_691ce2b70101ldmm.html https://blog.csdn.net/wiking__acm/article/de ...

  7. docker学习(一) 安装

    一.什么是docker 参见https://baike.baidu.com/item/Docker/13344470?fr=aladdin 个人的理解是,通俗来说,就是相当于一个方便携带且个体独立的虚 ...

  8. Python的入坑之路(1)

    (故事背景:由于涉及到机密的原因,暂时不方便透露,待后期再写.) 国庆长假过完之后,回来上班第二天下午,Boss跟龙哥把我叫了出去,问我要不要转人工智能.一脸懵逼的我,带着一脸懵逼听Boss说人工智能 ...

  9. PADS9.5的常用菜单栏

    1. PAD9.5常用的2个菜单是布线工具和选择过滤工具. 2. 布线工具菜单,如下图,依次是选择,移动,复制,删除,添加元件,布线,新建层次化符号,交换参考编号,交换引脚,添加总线,分割总线,延伸总 ...

  10. web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址

    web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址   Huang Jie Blog .Com-前端开发 http://www.huangjieblog.com/?feed=rs ...