`
hcmfys
  • 浏览: 356405 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

有关指针方面的一些问题!

阅读更多
首先要说明的是,在C语言中,()、[]运算符的优先级别要高于*指针运算符。
因此,下面基于运算符优先级来讨论一下C语言中指针用法里很容易混淆的几种情况:
int *p;//p为指向整型数据的指针变量
int *p[4];//p为一个指针数组,里面有4个元素,每个元素都是一个指向整型变量的指针。因为[]运算符的优先级别高,因此p首先与[4]结合,也就是说p是一个数组名,接下来再看该数组中的元素究竟是什么,从前面的int *可以看出数组中的元素是指向整型变量的指针。
int (*p)[4];//p是一个指针,它指向的是一个含有4个整型元素的数组。因为()运算符优先级别高,因此p先与*结合,这样就确定了p肯定是一个指针,接下来的工作就是看看究竟p这个指针指向什么,抛开(*p)不看,假如是int a[4]的话,那大家都会知道这个数组a是一个包含4个整型变量元素的一维数组,因此指针p就是指向这样一个数组——包含4个整型元素的数组。
int *p();//p是一个函数名称,该函数没有任何参数,该函数返回一个指针,该指针指向一个整型变量。同样,先从优先级来分析,因为()的优先级别高,因此p首先与()结合成p(),因此p就是一个函数名字,接下来再看该函数的一些特性,比如参数以及返回值之类的东西。
int (*p)();//p是一个指针,该指针指向一个函数,该函数没有参数,且返回一个整型变量。利用优先级来分析,p先与*结合,因此就能够首先确定出p是一个指针了,下面再看该指针指向什么东西,就像分析int (*p)[4]一样,抛开(*p)不看,如果是int fun()的话,就能够知道这是一个不带参数且返回整型变量的函数,因此指针p就是指向这样一个函数。
好了,有了上面的分析,相信大家对指针里这几个比较容易混淆的用法必然很清楚了,当然在指针的使用中还有指向指针的指针,比如int **p;以及指向多维数组的多重指针,但是相信有了以上基础之后,只要认真分析,肯定就能把问题迎刃而解了吧?
下面就来看一个稍微复杂些的指针方面的应用:
int (*p(char op))(int, int);
不知道大家是否可以看懂上面这一行中定义的东西,你能告诉我p是什么吗?呵呵,我先把谜底给大家,让大家一睹为快,p是一个函数名字。下面就来分析一下:
根据优先级来看p会首先与(char op)结合,因此p必定是一个函数名字,由p来表征的这个函数只含有一个字符型的参数op,并且该函数返回一个指针,如果是
int *p(char op)的话,大家都会很清楚的知道该函数会返回一个指针,且该指针会指向一个整型变量,但是对于int (*p(char op))(int, int);而言,p表征的这个函数肯定会返回一个指针,那么该指针到底会指向什么东西呢?呵呵,如果给你int (指针哈哈)(int,int),你肯定也会知道“指针哈哈”是指向一个函数的,该函数还有两个整型参数,且返回一个整型值,那么好了,知道了这一点就应该能够知道这里的p表示的真正含义了吧:p为一个函数名字,该函数带有一个char型参数,且返回一个指向函数的指针,该指针指向的函数包含两个整型参数、返回一个整型变量。哈哈,看懂没?
通常情况下,如果遇到类似问题时,我们不会把问题一次性搞得如此复杂,而是会拆解开来,一般都是先用typedef定义一个指向函数的指针,再用它定义好的这个东东去再定义一个函数,这个函数的返回值就是我们用typedef定义的那个东东哟,呵呵,请看下面的示例:
 
// 定义指向这类函数的指针
typedef int (*FP_CALC)(int, int);
FP_CALC s_calc_func(char op);//声明一个函数
其实,上面的两行就相当于下面的这一行啊:
int (*s_calc_func(char op))(int, int);//完成同样的功能——声明一个函数
但是如果我们不是来声明一个函数,而是来定义一个指向函数的指针变量时,
如果不用typedef的方式,那么将会是如下的样子:
int (*s_fp)(int, int);
这多少让大家不太容易接受,因为我们熟知并常见的定义变量的方式是:类型 变量名,如int a;
而上面这种方式定义变量,看似有点像函数声明了,呵呵,因此在使用到指向函数的指针时,通常都先采用typedef的方法来声明一个指向函数的指针,然后就可以用“类型 变量名”这种方式来定义了:
typedef int (*FP_CALC)(int, int);
FP_CALC s_fp;//这多好看呀,看得舒服吧?

下面再给出一个完整的引用,有兴趣的读者可以仔细研究研究,真的很有趣味:
-----------------------------------------------------------------------------------
typedef的使用中,最麻烦的是指向函数的指针,如果没有下面的函数,你知道下面这个表达式的定义以及如何使用它吗?
 
int (*s_calc_func(char op))(int, int);
 
如果不知道,请看下面的程序,里面有比较详细的说明

// 定义四个函数
int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);
// 定义指向这类函数的指针
typedef int (*FP_CALC)(int, int);
 
// 我先不介绍,大家能看懂下一行的内容吗?
int (*s_calc_func(char op))(int, int);
 
// 下一行的内容与上一行完全相同,
// 定义一个函数calc_func,它根据操作字符 op 返回指向相应的计算函数的指针
FP_CALC calc_func(char op);
 
// 根据 op 返回相应的计算结果值
int calc(int a, int b, char op);
 
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int mul(int a, int b)
{
    return a * b;
}
int div(int a, int b)
{
    return b? a/b : -1;
}
// 这个函数的用途与下一个函数作业和调用方式的完全相同,
// 参数为op,而不是最后的两个整形
int (*s_calc_func(char op)) (int, int)
{
    return calc_func(op);
}
 
FP_CALC calc_func(char op)
{
    switch (op)
    {
    case '+': return add;
    case '-': return sub;
    case '*': return mul;
    case '/': return div;
    default:
        return NULL;
    }
    return NULL;
}
 
int calc(int a, int b, char op)
{
    FP_CALC fp = calc_func(op); // 下面是类似的直接定义指向函数指针变量
       // 下面这行是不用typedef,来实现指向函数的指针的例子,麻烦!
        int (*s_fp)(int, int) = s_calc_func(op);
        // ASSERT(fp == s_fp);  // 可以断言这俩是相等的
    if (fp) return fp(a, b);
    else return -1;
}
 
void test_fun()
{
    int a = 100, b = 20;
    printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
    printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
    printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
    printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
}
 
运行结果
   calc(100, 20, +) = 120
   calc(100, 20, -) = 80
   calc(100, 20, *) = 2000
   calc(100, 20, /) = 5
分享到:
评论

相关推荐

    指针方面的书籍

    根据提供的信息,我们可以推断出这是一本关于C语言编程的经典书籍,特别是针对指针这一概念进行了详尽的解释。接下来我们将围绕“指针”这一主题进行深入探讨,并结合C语言的学习过程,来阐述该书可能涉及的重要知识...

    指针经典问题解析

    ### 指针经典问题解析 #### 指针的概念及分类 指针是一种特殊的数据类型,用于存储内存地址。理解指针对于编程至关重要,尤其是对于C/C++这样的语言而言。掌握指针需要理解以下几个方面: 1. **指针的类型**:指...

    c++指针方面的心得

    根据提供的文件信息,标题与描述均为“C++指针方面的心得”,这表明文章将主要围绕C++语言中的指针概念及其使用技巧进行探讨。由于标签部分与内容并不相关,因此我们将忽略这部分信息,直接从标题和描述中提取并展开...

    c++智能指针最全知识点即面试题目总结

    以智能指针的面试题线索,穿插讲解完最常用的四种智能指针的各个方面。本文讲解4个智能指针的基本概念和特性,以及其他设计到的知识点。讲解的过程中,如果此部分内容涉及到面试题目,会在旁边以这个题目的序号来...

    c,c++指针的一些知识总结,非常齐全

    在C和C++编程语言中,指针是一个至关重要的概念,它...通过不断的实践和学习,可以熟练运用指针解决各种复杂问题,提升编程效率。这份总结涵盖了指针的基础和进阶知识,对初学者和有经验的开发者来说都是宝贵的资源。

    C++线程安全问题及解决方法,C++智能指针

    内容概要:文章内容从原子性、可见性、有序性三个方面介绍C++线程安全问题的原因。通过原子操作、线程同步如互斥锁、读写锁、条件变量、信号量等方法解决C++线程安全问题。同时介绍了线程安全的单例,饿汉模式和懒汉...

    关于C语言指针应用方面问题详解

    c语言,有关指针应用问题,讲解的很仔细,透彻!

    指针的奥秘,神奇的指针

    因此,指针具有以下四个关键方面: 1. **指针的类型**:指针的类型决定了指针变量可以指向哪种类型的内存区域。例如,`int*ptr`声明了一个指向整型变量的指针,其类型是`int*`。在例一中,还展示了不同类型的指针...

    C语言指针详解 C语言指针详解

    本篇文章将深入探讨C语言指针的各个方面。 首先,我们需要了解指针的声明方式。在声明指针时,我们会指定指针所指向的数据类型。例如: 1. `int *p;` 这里,`p`是一个指针,它指向一个`int`类型的变量。`*`表示...

    精美鼠标指针下载内含20余款精美鼠标指针

    在IT领域,用户界面(UI)的个性化是提升用户体验的重要一环,而鼠标指针作为电脑操作中的一个重要元素,其设计和风格也能显著影响到用户的交互感受...同时,了解如何自定义鼠标指针也是提升计算机使用技巧的一个方面。

    蓝色半透明鼠标指针(Windows Vista系统鼠标指针)

    虽然Vista系统原版的鼠标指针已经过优化,但第三方或自定义指针可能会导致一些软件或游戏运行不顺畅,因为它们可能没有考虑到所有可能的指针形状和动画。因此,在享受个性化的同时,确保系统的稳定性和兼容性也是很...

    指针的概念

    本文旨在深入解析指针的概念,并通过具体的例子帮助读者更好地掌握指针的四个关键方面:指针的类型、指针所指向的类型、指针的值以及指针本身所占据的内存区。 #### 二、指针的类型 指针的类型指的是指针本身的...

    深入理解C语言指针.pdf

    要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。 首先,让我们来了解指针的类型。指针的类型是指针本身所具有的类型。...

    冒险岛鼠标指针

    这些文件名可能是以冒险岛游戏中的物品、场景或角色为灵感的鼠标指针,如789可能代表数字或计数元素,book可能是书本或魔法书的图像,water可能与水元素或水域有关,ear可能是角色的耳朵或听力相关的游戏元素,cute...

    c_c++指针详解 指针详解

    要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。 Declaring Pointers 声明指针需要使用指针声明符*,例如: int *p; //...

    马里奥鼠标指针 鼠标指针优化

    桌面优化并不仅仅局限于鼠标指针,还包括壁纸、屏保、快捷方式布局等多方面。通过合理搭配和个性化设置,可以使工作环境更加舒适,提升工作效率。马里奥主题的鼠标指针可以作为一个亮点,配合相应的壁纸或者主题元素...

    彻底搞定C指针 (彻底了解C指针的原理与机制)

    指针是C语言的精华,然而,很多人学习了 C 基础知识却始终对 C 指针不得要领,长期被 C 指针困扰,所以给大家推荐此书,本书作者运用了许多生动与亲切的例子,深入浅出地讲透了 C指针的原理与机制,并辅以编程实践中...

    C指针与陷阱 中文高清版

    《C指针与陷阱》是一本深入探讨C语言中指针使用技巧与常见问题的经典书籍。在C语言中,指针是其核心特性之一,它赋予了程序员直接操控内存的能力,但同时也带来了许多潜在的陷阱。这篇内容我们将深入讨论C语言中的...

    指针高级应用_虚函数

    在这个主题中,我们将深入探讨指针的高级应用,特别是与虚函数相关的知识,以及如何进行强制类型转换。通过理解和掌握这些知识点,你的C++技能将得到显著提升。 首先,让我们来看看“虚函数”。虚函数是C++中的一个...

Global site tag (gtag.js) - Google Analytics