复杂的指针结构应如何理解

1. 数组的定义

数组由数组元素的类型,数组名,[]以及数组长度构成。

int a[10] = {0};      //显式的数组长度10
int b[] = {1, 2, 3};  //隐式的数组长度3

2. 指针的定义

C++语言使用*符号把一个标识符声明为指针。

int *p1, *p2;     //p1 and p2 point to an int
string *pstring;  //pstring points to a string

3. 函数指针的定义

函数指针由标识符,返回值,参数列表组成

void (*funcPtr)(int, int);

阅读这类复杂的声明时,通用的方法是:从中间开始,依次向两边展开。

从中间开始是指,从变量名称开始,在这个例子中也就是funcPtr。然后去变量右侧寻找最近的元素(无),然后去左侧(*,表示funcPtr是一个指针),然后右侧((int, int),参数列表),然后左侧(void,返回值)。所以funcPtr是一个指向参数列表为(int, int),返回值为void类型函数的指针。

下面再看一些复杂的例子:

void *(*(*fp1)(int))[10];

fp1临近右侧无,左侧*,所以fp1为指针,右侧紧跟参数列表(int)表明fp1是函数指针,且函数的参数列表为(int), 所以其余部分应为函数返回值,若用fp_ret来简化,则可表示为:

void *(*fp_ret)[10];

fp_ret是一个指针,指向长度为10的数组,数组中的元素类型为void*。所以综合起来就是:fp1是一个函数指针,其指向的函数具有一个int类型的参数,且返回值为一个指针,该指针指向一个有10个void*元素的数组。

typedef double (*(*(*fp3)())[10])();
fp3 a;

fp3是一个函数指针,其指向的函数参数为空, 返回值是一个指针,指向长度为10的数组,数组元素是参数列表为空返回值为double类型的函数指针。

时间: 2024-10-25 00:30:34

复杂的指针结构应如何理解的相关文章

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

对offsetof、 container_of宏和结构体的理解

offsetof 宏 #include<stdio.h> #define offsetoff(type, member)      ((int)&((type*)0)->member) /* ((type*)0)->member 释义:声明一个相应类型的结构体指针,该指针指向0地址处.再通过该指针访问各元素.我们只要获取一个指针就能访问其内部的元素吗,可以这么搞?其实我是想联系全局和非全局变量,通过上面这个代码也许你不明白我要表达的意思.请继续慢慢看,直到本文后面,结合本文

指针的入门和理解

/* ============================================================================ Name : TestPointer.c Author : lf Version : Copyright : Your copyright notice Description : 指针的入门和理解 一个程序载入内存时,系统会为变量和函数均分配内存,所以每个变量和函数都有其对应的内存 地址. 所以在C语言中有一个很常见的操作&就是用来取地

Go-常识补充-切片-map(类似字典)-字符串-指针-结构体

目录 Go 常识补充 Go 命名 打印变量类型科普 _ 关键字 命名规范相关 包目录规范 切片 多维切片 切片初始化的方法 多维切片初始化 切片删除元素(会略微影响效率 ,少用) copy 函数 打散切片 循环打印多维切片 Map (类似 python 字典) map 定义及初始化 赋值.取值.改值 map 删除元素.参数传递 map 相等比较.循环遍历 字符串 字符串的定义.长度.遍历字节.字符 指针 向函数传递指针参数 传递数组指针 (最好是用切片) 结构体 结构体零值 匿名结构体 结构体指

C++ 结构体深入理解

1. 结构体基础知识 有时需要将不同类型的数据组合成一个有机的整体,以供用户方便地使用.这些组合在一个整体中的数据是互相联系的.例如,一个学生的学号.姓名.性别.年龄.成绩.家庭地址等项,都是这个学生的属性,见图7.1. 图 7.1 可以看到学号(num).姓名(name).性别(sex).年龄(age).成绩(score ).地址(addr)是与姓名为“Li Fun”的学生有关的.如果在程序中将num,name,sex,age,score,addr分别定义为互相独立的变量,就难以反映出它们之间

指针、数组的理解与关系

一.指针的本质:变量,指针变量就是指针变量int *p:两个变量,一个p(指针变量本身)是int *类型的 另一个是*p(指针指向的那个变量)是int类型的注:指针说白了就是指针类型,前面定义的int类型是为了说明指针指向的那个数的类型,所以指针的解析方式都是按地址来解析的(不管你是char *还是double *,解析方式都是地址)而指向的那个数的类型就要看你怎么定义的了例如:int *aa是按照地址来解析的:*a则是按照int类型来解析的. (1)所有的类型的数据存储在内存中,都是按照二进制

JVM内存结构---《深入理解Java虚拟机》学习总结

本文转自:http://www.cnblogs.com/jilodream/,作者:王若伊_恩赐解脱 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域的用途各不相同,同时也依据着各自的执行规则,独立的创建和销毁数据. 虚拟机内存的划分,如图所示: 线程之间互相独立的区域有: 虚拟机栈 .本地方法栈.程序计数器 线程可以共享数据的区域: 方法区 .堆 每个区域的作用分别如下: 程序计数器 Program Counter Register: 众所周知,虚

指针与链表的理解

一.指针的概括 1.指针的类型       基本数据类型比如 int.char ,还有 一些复杂的比如 int (*p)[], 指向数组的指针,像这种的判断就是指针名字去掉 , 指针的类型类型就是 int(*)[],其实就是指向数组的指针  2.指针所指向的类型 当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待.  你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型. 例如:int*ptr:指针所指向的

对C/C++指针问题的彻底理解(复习1)

理解第一篇 上完大学不是我吹(仅仅说我认识的本学校的)估计很明白指针的人绝对不超过百分之50(因为问他们讲得断断续续的自己也说不明白,只知道那样可以用) 学链表树形结构.......等结构的时候一直困扰一个问题 例如int* a 和int  *a  ,*a,**a,int**a  或者说*******a 到底什么意思?大家都知道这是指针 ,指针本质是什么都说是地址.每次编程的时候都是报错了才能发现指针错误再去改正其实就是不太理解 例子 1 void Functionc() { int** a=