c指针与数组,函数的混合定义

参考《让你不再害怕指针》

 

从复合函数整体换元从外层到内层,并且每层从函数调用和赋值来讲肯定有意义,这两个角度理解。前提还是要知道结合的优先级。

 

int p; //这是一个普通的整型变量

 没什么好说的

int *p;

//首先从P 处开始,先与*结合,所以说明P 是一

//个指针,然后再与int 结合,说明指针所指向

//的内容的类型为int 型.所以P 是一个返回整

//型数据的指针

 没什么好说的

int p[3];

//首先从P 处开始,先与[]结合,说明P 是一个数

//组,然后与int 结合,说明数组里的元素是整

//型的,所以P 是一个由整型数据组成的数组

int A ;A 是一个int

p[3] = A, 看成赋值语句,那么说明p 是一个 int 数组

 

int *p[3];

//首先从P 处开始,先与[]结合,因为其优先级

//比*高,所以P 是一个数组,然后再与*结合,说明

//数组里的元素是指针类型,然后再与int 结合,

//说明指针所指向的内容的类型是整型的,所以

//(感觉这句话 理解起来有点突兀,为什么 不是 指向 p[3] 毕竟 …)

//P 是一个由返回整型数据的指针所组成的数组

 

p[3]看成 整体

int * A ,A就是一个指针,指向int

p[3] = A,看成赋值语句,说明p是一个数组,数组 元素为指针。

合起来: p是一个数组,数组 元素为指针。

 

int (*p)[3];  

 (*p)看成 整体

int  A[3] 是一个数组,说明A 是一个int [3] 数组,

*p=A ,看成赋值语句,说明 p 指向了A,*p就是 解指针p 可以接受数组 int[3]

合起来: p 指向了一个数组,数组有3个 元素,元素类型为int

 

int **p;

//首先从P 开始,先与*结合,说是P 是一个指针,然

//后再与*结合,说明指针所指向的元素是指针,然

//后再与int 结合,说明该指针所指向的元素是整

//型数据.由于二级指针以及更高级的指针极少用

//在复杂的类型中,所以后面更复杂的类型我们就

//不考虑多级指针了,最多只考虑一级指针.

 没什么好说的

int p(int);

//从P 处起,先与()结合,说明P 是一个函数,然后进入

//()里分析,说明该函数有一个整型变量的参数

//然后再与外面的int 结合,说明函数的返回值是

//一个整型数据

 没什么好说的

 

int * p(int)

int * A; A 是一个int指针

A = p(int)  ;看成函数调用赋值语句,那么p 是一个函数 ,返回值为A

合起来: p 是一个函数,接收一个int 型参数,返回值一个 int 指针

 

int (*p)(int);

 (*p) 是一个整体

令 int (*p)(int) = int A(int);

那么 A 是一个函数,函数接收一个int 返回一个int

A = (*p) 看成调用语句行不通,没关系就反过来,   

(*p)=A , 看成赋值语句,

p是一个函数指针 ,因为解应用后可以接收A

合起来:p是一个函数指针 ,函数接收一个int 返回一个int

 

int *(*p(int))[3];

令 int *(*p(int))[3]    = int * A [3]

那么A是一个数组 ,数组元素为 int 指针

A = (*p(int)) ,能看成调用语句吧。(因为A是一个数组,函数不能直接返回,这里通过返回指针所以p前面有个*)

p 是一个函数 ,返回一个指针,解引用后,就是数组A

合起来:p 是一个函数,接收一个int 参数,返回一个指针,指向数组,数组有3个元素,元素是 int * 指针

注意 (*p(int)) 里的 * !!!

int * (fun1(int para1,int para2))[4];  ## err

这个 fun1就是 直接返回数组了,但是C/C++ 函数是不能直接返回数组的,(只能用 struct/class 包装,或是使用C++11的std::array。)

int *(* (*p)(int))[3];

p 是一个函数指针,这个函数接收一个int 参数,返回一个指针,指向数组,数组有3个元素,元素是 int *

 

int  (*p(int))[3];

p 是一个函数,接收一个int 参数,返回一个指针,指向数组,数组有3个元素,元素是 int  

 

int ia[3][4]

int (&row)[4] = ia+1 // 这个是对整个数组的引用

int& row[4] = ia+1 // 元素为引用的数组,这个是不存的,编译通不过

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值