C语言笔试题

1.整除的概念是什么?

x能被y整除,就是x/y,也是说y能整除x。

一招攻克所有指针:

C语言标准规定,对于一个符号的定义,编译器总是从它的名字开始读取,然后按照优先级顺序依次解析。

对,从名字开始,不是从开头也不是从末尾,这是理解复杂指针的关键!!!

对于初学者,有几种运算符的优先级非常容易混淆,它们的优先级从高到低依次是:

·定义中被括号括()括起来的那部分。

·后缀操作符:括号()表示这是一个函数,方括号[]表示这是一个数组。

·前缀操作符:函数:表示函数的返回值类型;数组:表示数组元素的类型。

 

(1)int *p1[6]

第一步:[]的优先级高于*,所以先解析p1[6],表示p1是一个拥有6个元素的数组。

第二步:再解析int *,它用来说明数组元素的类型。

第三步:p1是一个拥有6个int *元素的数组,也叫指针数组。(指针表示元素的类型是指针)

 

(2)int (*p3)[6]

第一步:先解析*p3,p3是一个指针。

第二步:再解析int [6],它是一个拥有6个int元素的一维数组。

第三步:p3是一个指向拥有6个int元素的二维数组的指针,也叫二维数组指针。(指针表示指向的是一维数组)

 

 

(3)int (*p4)(int,int)

第一步:先解析*p4,p4是一个指针。后边有()说明p4指向的是一个函数,括号中的int,int 是参数列表,开头的int用来说明函数的返回值类型。

第二步:p4是一个指向原型为 int func(int,int)的函数的指针。(指针表示指向的是函数)

 

(4)int *p5(int,int)

第一步:先解析p5(int,int),表示p5是一个函数,函数的返回值是int *类型。

第二步:p5就是返回值类型为int *的指针函数。(指针表示返回值的类型)

 

口诀:

指针二字在前面,表示返回值或元素类型

指针二字在后面,表示指向xxx

 

(5) char *(*c[10])(int **p)

第一步:先解析c[10],表示c是一个拥有10个元素的数组,*c[10]表示c是一个指针数组,只是不知道指针指向的是什么数据类型。

第二步:再解析int **p),()说明是一个函数,int **p是函数参数。

第三步:再解析char *,说明函数返回值的类型为char型指针。

第四步:c是一个拥有10个元素的指针数组,且每个指针指向原型为char *pfunc(int **p)的函数。

*******************************************************************************

typedef用法研究:typedef oldName newName

(1)基本数据类型起别名:

typedef int size_t;

int a;

size_t a;

 

(2)数组类型起别名:

typedef char array[20];

表示arraychar [20]类型的别名,它是一个长度为20数组类型。(数组也是有类型的!!!)

array a,b,c;<=>char a[20],b[20],c[20];

 

(3)结构体类型起别名:

typedef struct student

{

char name[20];

int age;

int sex;

}stu;

表示stu是结构体struct student类型的别名,可以使用stu直接定义结构体变量。

stu a,b;<=>strcut student a,b;

 

(4)指针类型起别名:

<1>二维数组指针

typedef int (*ptr_to_array)[4];

表示ptr_to_array int [4]类型二维数组指针类型别名,可以直接指向int [4]整型一维数组。

ptr_to_array

 

<2>函数指针

typedef int (*pfun)(int,int);

表示pfunint (int,int)类型函数指针类型的别名,可以直接指向int (int,int)类型函数。

*******************************************************************************

const(constant)/读写权限问题/

创建常量的格式:

const dataType varName = value;(推荐)

dataType const varName = value;(两种是等价的,不建议)

 

(1)const 和 指针

const int *p1;(指针观点来看这个问题)

int const *p2;(指针观点来看这个问题)

int * const p3;(指针观点来看这个问题)

 

(2)const  和 函数形参

C语言中单独定义变量没有优势,完全可以用#define命令代替。

const 通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针的数据,就可以用const 来限制。

size_t strlen(const char *str);

int strcmp(const char *str1,const char *str2);

...

 

(3)const 和 非const类型转换

const char* char*是不同的类型,不能将const char*类型的数据赋值给char *类型变量。单数反过来就可以,编译器允许将char *类型数据赋值给const char*类型的变量。

 

这种限制很容易理解,char *指向的数据有读/写权限,而const char*指向的数据只有读权限。

降低数据的权限不会带来任何问题,但是提升数据的权限就有可能引发危险。

posted @ 2020-04-10 14:10  坦率  阅读(488)  评论(0编辑  收藏  举报