指针与数组
来源:互联网 发布:淘宝虚拟物品怎样退款 编辑:程序博客网 时间:2024/06/08 02:05
指针和数组的对比( arr[] 与 &a )
此处引用《C语言深度解剖》中一个表格,很直观的区别了指针与数组
“指针就是指针,数组就是数组,二者并没有任何关系,只是常用相似的外衣来迷惑你”
下面我们来看一下常常出错的地方
1.指针数组
首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称下面这种形式就是的就是一个指针数组:
int *p1[10];
2.数组指针
首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称,形式如下:
int (*p2)[10];
辨别指针数组与数组指针这里需要明白一个符号之间的优先级问题。“[]”的优先级比“ * ”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int * 修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“ * ”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针
3.函数指针
顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。如下:
char * (*pf)(char * p1,char * p2);
4.函数指针数组
“char * (* pf)(char * p)”
定义的是一个函数指针 pf。既然 pf 是一个指针,那就可以储存在一个数组里。把上式修改一下:
char * (* pf[3])(char * p);
这是定义一个函数指针数组。它是一个数组,数组名为 pf,数组内存储了3 个指向函数的指针。这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数
在函数指针数组中,调用函数可以用如下几种方式:
char * (*pf[3])(char * p);pf[0] = fun1; // 可以直接用函数名pf[1] = &fun2; // 可以用函数名加上取地址符pf[2] = &fun3;
5.指向函数指针数组的指针
char * (*(*pf)[3])(char * p);
我们来解析一个语句,加深对指针的理解: (*(void(*) ())0)();
第一步:void(*) (),可以明白这是一个函数指针类型。这个函数没有参数,没有返回值。
第二步:(void(*) ( ))0,这是将0 强制转换为函数指针类型,0 是一个地址,也就是说一个函数存在首地址为0 的一段区域内。
第三步:(* void(*) ( ))0),这是取0 地址开始的一段内存里面的内容,其内容就是保存在首地址为0 的一段区域内的函数。
第四步:(* (void(* ) ( ))0)(),这是函数调用。
char * (*pf[3])(char * p);
这是定义一个函数指针数组。它是一个数组,数组名为pf,数组内存储了3 个指向函数的指针。这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。这念起来似乎有点拗口。不过不要紧,关键是你明白这是一个指针数组,是数组。
0 0
- 指针:指针与数组
- 指针与指针数组
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 数组指针与指针数组
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组与数组指针
- 指针数组 与数组指针
- 指针数组与数组指针
- 数组指针与指针数组
- 指针数组与数组指针
- 指针数组与数组指针
- 【深入Java虚拟机】之一:Java内存区域与内存溢出
- Linux下的FILE*结构体
- sftp连接--文件下载
- textview禁止点击
- MySQL5.7.18 源码安装详细步骤
- 指针与数组
- GetHostWnd() 与 GetActiveWindow() 的用法区别
- 详细解释CNN卷积神经网络各层的参数和链接个数的计算
- Linux查看日志命令
- Java基础练习题 (4)数组操作
- Retrofit常用方法入门
- 使用soapUI测试WebService
- 补2,实验5.5
- 多态