1.程序输出结果是 8
int fun(char *s)//定义一个函数,传入参数为字符串
{
char *p = s;//定义一个指针指向传入字符串的首地址
while (*p!='\0')//判断是否字符串结束标志‘\0’
{
p++;//如果p指向的地址不为‘\0’的话,p指针后移一位char,直到为\0结束
}
return(p - s);//返回字符串结尾到字符串开头的字母数目,也就是传入字符串的长度
}
int main()
{
printf("%d\n", fun("goodbye!"));
system("pause");
return 0;
}
2.下列关于数组与指针的区别描述正确的是 B
A. 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建
B.用运算符 sizeof 可以计算出数组的容量(字节数)
C. 指针可以随时指向任意类型的内存块
D. 用运算符sizeof 可以计算出指针所指向内容的容量
A.堆上创建动态数组
B.sizeof(数组名)就是数组的容量
C.const指针不可以
D. char* str = "hello"; sizeof(str)不能计算出内容的容量,只是指针的容量。
3.给定如下代码: int arr[4]={0}; int brr[4]={1}; 数组 arr 和 brr 的值为 {0,0,0,0},{1,0,0,0}
聚合类型只初始化一部分,其余部分为0.
4. 数组定义为 int a[4]={0}; 表达式 a++ 是错误的。
a代表数组名或者内存连续区域第一块数据的地址。[]表示基址寻址。
加*表示对数组起始位置按照数组元素数据类型寻址取值第一个元素。加&表示取第一个元素地址。a与&a与&a[0]相同。a为常量,可以运算,不可赋值。数组中a指的是数组首地址,地址是常量,常量是不可以自加的,只有变量才可以自加。
5.如下代码运行结果是 250
int main()
{
unsigned char a = 0xA5;
unsigned char b = ~a>>4+1;
printf("%d\n", b);//250
system("pause");
return 0;
}
这道题考查两个知识点:一是类型转换问题;而是运算符优秀级问题。
对于第一个问题:unsigned char b=~a>>4+1;编译器会把a和4先转换成int型,再进行计算。然后将计算结果转换成unsigned char 赋值给b。
对于第二个问题:因为“~”的优先级高于>>的优先级,故先对1010 0101取反 01011010,再右移。因为+的优先级高于>>,故先加再位移。于是0101 1010 右移5位结果是00000010.最后的结果应该是2才对,但是把如上的指令放到vs2013中运行,答案居然是250.
那么到底是什么地方出了问题?在调试的过程中进入汇编指令。可以看到高级语句转换为汇编语言以后,是先执行取反再位移的。
我们看到eax是16位的寄存器,于是机器中0xA5的寄存中表达是0000 0000 1010 0101 ,取反是1111 1111 0101 1010,
那么右移5位是0000 0111 1111 1010,由于是unsigned char型的只能表示第8位的数组,即250.
6.如下代码输出结果为 1,1
int main()
{
const int i = 0;
int *j = (int *)&i;
*j = 1;
printf("%d,%d", i, *j);// 1,1
system("pause");
return 0;
}
在C语言中,const变量只不过是修饰该变量名,它并不能使内存变为只读。也就是说,我们不能通过变量名再去操作这块内存。但是可以通过其它方法,如指针,通过指针是可以修改被const修饰的那块内存的。
7. 写出中缀表达式: 12+5*(2+6)-1 对应的后缀表达式:12 5 2 6 + *+ 1-
中缀表达式a + b*c + (d * e + f) * g,其转换成后缀表达式则为a b c * + d e * f + g * +。
1)先按照运算符的优先级对中缀表达式加括号,变成( ( a+(b*c) ) + ( ((d*e)+f) *g ) )
2)将运算符移到括号的后面,变成((a(bc)*)+(((de)*f)+g)*)+
3)去掉括号,得到abc*+de*f+g*+