【三两波折】char *foo[]和char(*foo)[]有何不同?

本文详细介绍了C语言中数组、指针和运算符的优先级,如数组下标、函数调用和结构体成员访问的结合方式。重点讨论了char*数组与char(*)[3]的区别,以及如何正确理解和使用指针指向数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、先谈优先级

最高级别 —— 有四个,他们并不像运算符:

[]数组下标左到右结合
()用于(表达式) or 函数名(形参表)左到右结合
.读取结构体成员左到右结合
->读取结构体成员(通过指针)左到右结合

第二级别 —— 他们作用于单个变量 or 表达式:

*取址运算符,作用于指针右到左结合

2、char *foo[]

 数组下标优先级最高,结合方式“左到右”,因此等价于“char * (foo[])”。

问:int data[3];是什么意思?

答:定义了一个数组,大小是3,数组里存的是int 类型。

抽象一下,type data[x]; 定义了一个数组,大小是x,数组里存的是type类型。

char *  foo[3]; 定义了一个数组foo,大小是3,数组里存的是char *类型。

3、char (*foo)[]

我们已经知道char *foo[3]; 指的是一个大小为3的数组,数组存的是char *,通过foo[i]或*(foo + i)可以读取到对应为止的值。那如何理解:char (*foo) [3]?

取址运算符已经和foo优先结合了,foo一定是一个指针。这个指针指向一个地址,这个地址是1*3大小的数组 [char][char][char]。—— 指向数组的指针

char ch[3] = {'a', 'b', 'c'};
char (*foo)[3];
foo = &ch; // 合理
foo = ch; // 不合理,指向char的指针,不等于指向char数组的指针。
foo = &ch[0]; // 不合理,指向char的指针,不等于指向char数组的指针。

ch:指向数组首元素的指针

&ch:指向整个数组的指针。

对二者进行指针运算时,是不同操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值