亲宝软件园·资讯

展开

typedef声明变量也是一种求值过程

RYZZ 人气:1

前言:

什么叫做:声明变量是求值过程?请看下面的声明,

int i;

很简单,声明了个整型变量i,再看如下声明,

int *p;

也很简单,立刻反应出来它是指向整型的指针,但是具体如何推倒出来的呢?其实在C语言中,变量的声明就是一种求值过程,把*p这部分声明看成表达式,对这个表达式的求值的结果是int类型,这样就可以倒推出p是指针整型的指针了,因为只有对指向整型的指针进行解引用操作才是整型类型!还有很多复杂的声明,都可以使用这种方法求其具体的类型。

下面让我们来验证typedef定义的新类型和普通的声明变量一样,也是一种求值过程:

 1 /*
 2 验证:
 3 用typedef定义的新类型名声明的变量是否与普通的声明变量一样,是一种求值的过程,还是单纯的替换过程?
 4 */
 5 
 6 typedef short int arrTen[10]; //定义了一个新类型,这个类型是:一个包含10个short类型元素的一维数组
 7 
 8 int main(){
 9     short int j;
10     short int myarr[10];
11     arrTen *arr1;
12     /*
13     现在需要验证arr1的类型:
14     假设是求值过程,那么意味着对表达式*arr1求值的结果是arrTen类型,也就是说arr1是一个指针,指向一个数组,但是在C语言中数组是一个很朴素的概念,它只是连续的内存单元,所以指向一个数组准确地说是指向一片拥有10个short元素的内存空间
15     假设是替换过程,那么上述声明相当于:short int *arrTen[10],而这个声明意味着arrTen是一个拥有10个元素的数组,每个元素的类型是指针,指向short类型的内存单元,在这里发现了问题,如果声明(用typedef定义(或声明)新类型时和用typedef声明变量时)用到了很多操作符,替换过程就会出现优先级的失调,所以在此猜测这种假设是错的
16     */
17 
18     /* 实际操作验证 */
19     //arr1[1]=&j; //报错,GCC5.2:error: assignment to expression with array type
20     arr1=&myarr; //未报错,myarr的类型是一个指向short的指针,而&myarr的类型是一个指向拥有10个short元素的数组的指针
21     /* 综上,arr1是一个指向数组的指针,所以第一种假设成立,typedef声明变量时也是一种求值过程 */
22 
23     return 0;
24 }

加载全部内容

相关教程
猜你喜欢
用户评论