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];
表示array是char [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);
表示pfun为int (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*指向的数据只有读权限。
降低数据的权限不会带来任何问题,但是提升数据的权限就有可能引发危险。