C 语言中 (*n)[20] 与 *n[20] 的区别

C 语言中 (*n)[20] 与 *n[20] 的区别

在 C 语言中, 定义一个指针数组可以按照以下的方式定义:

int *n[20];

由于 [] 的运算级别要比 * 高, 因此这里的声明变量应当按照从右往左的顺序,即:n 是一个数组, 这个数组内的值是指针类型的,指针指向的数据类型为 int。因此这里声明的是一个int类型的指针数组。

而以下的定义方式:

int (*n)[20]

由于 () 的优先级要比 [] 高, 因此这里的声明顺序应当是按照 括号内的声明——> [] 的声明,即:n是一个指针,它指向的数据类型是数组类型的,数组内的数据类型是 int 类型的。

由于括号的添加,使得两者之间的差异显著增大,具体表现在:使用 n 变量的应用对象不同。
如下示例所示:

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char ** argv) {
        int (*a)[20];
        int *b[20];

        printf("(*a)[20]: %ld vs *b[20]: %ld\n", sizeof(a), sizeof(b));
        
        exit(0);
}

在 64 位的计算机上,运行的结果如下所示:

(*a)[20]: 8 vs *b[20]: 160

这是由于在 64 位的计算机上, 指针类型将占据 8 字节的空间,而在上文的 C 程序中:

  1. a 是一个指向数组的指针,因此使用 sizeof 计算其大小时将返回指针占用的空间大小;
  2. b 是一个指针数组,总的来讲它还是一个数组,因此 sizeof 在计算其大小时将会按照一般的数组的计算方式计算其占用的空间(得到整个数组总的占用空间),由于一个指针占用 8 字节,因此得到 b 占用的空间就是 160 字节。

值得注意的是,在 32 位的计算机上指针占用的空间为 4 字节,因此程序运行的结果将会有差异。


下图是 C 语言的操作符的运算优先级:
在这里插入图片描述

对于变量的声明,如果想深入了解的话,可以阅读 《C专家编程》(Peter van der Linden) 第三章,里面有具体的介绍。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值