C语言复杂指针理解

学习和使用C语言近十年了但对C语言的复杂指针依然有些迷糊索性花点时间分析一下,下面是一些心得,希望对读者有所帮助

取The C Programming Language中的两个例子以分析

char (*(*x())[])();

char (*(*x[3])())[5];

若直接让我们说出这两个x分别是什么意思往往会有一些困难, 这里我们可以使用代入法(暂且叫代入法)来分析

分析结果转述原则:

左端=右端(比如下面的Y=*x()中Y为左端, *x()为右端)

若右端为数组则左端可被看作右端的其中一个元素

若右端为函数则左端可被看作右端函数的返回值

直到无嵌套为止

分析步骤:

1.取最内的元素组合作欲被代入项( 如下面的*x() )

2.对欲被代入项做分析解释( 如对*x()进行解释:x是一个返回一个指针的函数 )

3.生成新的分析语句 ( 如 char (*(Y)[])(); )

4.精简新生成的分析语句( 如char (*(Y)[])();为char (*Y[])(); )

5.递归进行如上操作直到分析语句中无嵌套存在为止

6.根据分析转述原则转述出结果

示例分析如下:

char (*(*x())[])();

令Y=*x()

x为一函数此函数返回一个指针

有如下:

char (*(Y)[])();

即char (*Y[])();

其中*Y[]为一指针数组 其中每一项为一指针

令Z = *Y[]

则有:char (Z)();

即 char Z()

其中Z为一个函数该函数返回一个字符

根据转述原则得结果如下:

x是一函数,该函数返回一个指针,该指针指向一个指针数组,该数组的每一项为一指针,这些指针中每一个指向一个函数,这些被指向的函数返回一个字符

修饰如下:

x是一个函数,该函数返回一个指针数组,其中每一项指向了一个函数,被指向的函数返回一个字符

第二个:

char (*(*x[3])())[5];

*x[3]   x为一个指针数组其中每一项为一指针

令Y = *x[3];

得:char (*(Y)())[5];

即:char (*Y())[5];

*Y() Y为一函数该函数返回一个指针

令: Z = *Y()

得:char Z[5];

Z是一个含5个字符的字符数组

根据转述原则得出结果如下:

x是一个指针数组其中每一项为一个指针, 这些指针中每项指向一个函数, 被指向的函数返回一个指针, 被返回的指针指向一个含有5个字符的字符数组

修饰如下:

x是一个指针数组, 其中的每一元素指向一个返回一个包含5个字符的字符数组的函数

时间: 2024-10-06 19:40:41

C语言复杂指针理解的相关文章

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

[c++]this指针理解

#include <iostream> using namespace std; /** * this 指针理解 */ class A{ int i; public: void hello(){ cout<<"Hello"<<endl; } }; int main(){ A *p=NULL; p->hello(); } 由于单独开发基于c++的编译器,c++程序翻译成c程序后在,在使用c语言的编译器进行编译. p->hello(); 翻译

C语言07指针高级

01内存四区 接口封装和设计思想引导 接口封装设计思想引导 Sckclient客户端api模型设计 第一套api函数 #ifndef _SCK_CLINT_H_ #define _SCK_CLINT_H_ //函数声明 // 1.client环境初始化 int sckClient_init(void **handle); //5 day // // 2.client发送报文 int sckClient_send(void *handle, unsigned char *data, int dat

IOS开发系列--C语言之指针

概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 什么是指针 数组和指针 函数指针 什么是指针 存放变量地址的变量我们称之为"指针变量",简单的说变量p中存储的是变量a的地址,那么p就可以称为是指针变量,或者说p指向a.当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对应的存储空间中拿到a的值,这种方式我们称之为"直接

C语言二重指针与malloc

(内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include <stdio.h> int main() { char *s = "I love you"; char *s1 = "you love me"; char *s2 = "she love you"; char *s3 = "he l

关于C语言的指针、链表的原理和各类操作

今天课上我们老师为我们讲述了c语言的指针.链表的原理以及各类操作. 一.指针 1.指针 指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针.指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针. 2.数

有关C++ std::string 类的类型转换 其他语言永远无法理解的伤

最近做了个项目,C++的MFC窗口程序,一个基于dialog的学生-图书管理系统,有一些感触,最后会放上一些项目截图和部分代码提供大家参考.如果有什么好方法和建议欢迎指导. 强类型,为什么这么伤 我知道强类型是很必要的,但是最近使用的都是一些弱类型的语言,到回来使用C++的时候还真是很不习惯.std::string在学的时候就知道了,好用但还是跟c标准char[]有很大区别的,MFC编程中又加入了没有学过的Cstring和LPSTR.LPWSTR等,下面我就来分享一下一些有关类型转换的感受. 什

C语言中指针和数组

C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵.但是程序员一般都有一种迷之自信,总认为自己是天选之人,明知山有虎,偏向虎山行,直到最后用C的人都要被指针虐一遍. 指针 首先,明确一个概念,指针是什么,一旦提到这个老生常谈且富有争议性的话题,那真是1000个人有1000种看法. 在国内的很多教材中,给出的定义一般就是"指针就是地址",从初步理解指针的角度来说,这种

C语言的指针变量

C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: int a = 12; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透明的不用关心 */ 指针变量存储的是变量的地址, 比如: int a = 12 , *b; b = &a; /*如上,定义了一个整型变量a并赋值12,一个整型指针变量b 然后 用 & 取值运算符 取到变量a的地址空间值,存储到指针变量b中 此时变量b中存储的是变量a中的地址