以下整理自湖南大学考研真题。
1、C语言源程序文件经过C编译程序编译连接之后生产一个后缀为“.exe”的文件
2、以下选项中不正确的整型常量是()
A、12L B、-10 C、1,900 D、123U
3、表达式_____不符合C语言语法,若变量以正确定义并赋值
A、4&&3 B、+a C、a=b=5 D、int(3.14)
4、在字符数组str[]="hello\nworld\n"中,‘\n’为一个字符,该数组长度为13
5、结构体的赋值:
struct node{
char s[10];
int k;
}p[4];
p[0]->k=2正确,p[0].s="abc"错误。
6、C语言中基本的数据类型有 整型、字符型、浮点型
7、C语言中普通整型变量的类型说明符为 int ,在内存中占 2 字节,有符号普通整型的数据范围是 -32768~32767(-2^15~2^15-1)
8、原码反码和补码:(8位,以-35为例)
原码 | 最高位存放符号, 正数为0, 负数为1。 例:-35 --> 10100011 |
反码 | 正数的反码是其本身; 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。 例: 10100011 --> 11011100 |
补码 | 正数的补码就是其本身; 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1) 例:11011100 --> 11011101 |
注:考试给的答案是16位。
9、所谓“指针”就是 地址 ,“&”运算符的作用是 按位与或取地址 ,“*”运算符的作用是 乘积或指针
10、文件:
建立一个名为“myfile”的文件:
FILE *fp;
fp=fopen("myfile.txt", "w");
要记住最后要关闭文件流:
fclose(fp);
11、sizeof()计算当前字符数组总元素个数,包括'\0';strlen()不包括'\0':
char s[9] = "computer";
printf("%d\n",sizeof(s));
printf("%d\n",strlen(s));
12、从键盘读取字符串的方法:
char str[100];
gets(str);
puts(str);
1、函数参数传递时传值与传地址的区别:
传值 | 把实参的值赋给形参,对形参的值进行修改不会影响到实参。 |
传地址 | 传递的是地址,实参和形参指向同一对象,改变形参的值实参的值也会相应改变。 |
2、#include
<> | 从标准头文件的位置引用头文件。(标准或系统提供的头文件) |
"" | 引用的是用户程序目录中相对路径里面的头文件。(程序自己的头文件) |
3、sizeof()的使用:
详细可参考:https://blog.csdn.net/u011677209/article/details/52837065
#include
#include
void fun(char str[100]){
printf("3,%d\n",sizeof(str));
}
int main()
{
char str[]="Hello";
char *p=str;
printf("1,%d\n",sizeof(str));
printf("2,%d\n",sizeof(p));
fun(str);
return 0;
}
如上程序,在32位系统中,输出结果为:
1,6
2,4
3,4
(1)sizeof()的作用是返回一个对象或者类型所占的内存字节数,str数组中,加上结束符'\0'一共是6个字符,char类型占1个字节,因此共6字节。
(2)指针p记录了另一个对象str的地址,等于计算机内部地址总线的宽度。所以在32位计算机中 ,一个指针变量的返回值必定是4(注意结果是以字节为单位)。
(3)在fun()函数中,数组是“传址”的,只会把实参的地址传进去,而不会分配一个大小为100的数组,所以它实际上相当于是一个指针,因此结果也为4。
4、分析下面的程序:
#include
#include
char *GetMemory(){
char p[]="hello world";
return p;
}
void Test(){
char *str=NULL;
str=GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
函数GetMemory()中返回的p是其局部变量,在该函数执行完“return p;”后p就被释放掉了,因此在Test()中str并没有获取到p的值,输出的是乱码。
5、有序数据序列的查找——二分法:
#include
//递归算法
int recurbinary(int *a, int key, int low, int high)
{
int mid;
if(low > high)
return -1;
mid = (low + high)/2;
if(a[mid] == key) return mid;
else if(a[mid] > key)
return recurbinary(a,key,low,mid -1);
else
return recurbinary(a,key,mid + 1,high);
}
//非递归算法
int binary( int *a, int key, int n )
{
int left = 0, right = n - 1, mid = 0;
mid = ( left + right ) / 2;
while( left < right && a[mid] != key )
{
if( a[mid] < key ) {
left = mid + 1;
} else if( a[mid] > key ) {
right = mid;
}
mid = ( left + right ) / 2;
}
if( a[mid] == key )
return mid;
return -1;
}
int main()
{
int a[] = {1,2,3,4,5,6,7,8,9,12,13,45,67,89,99,101,111,123,134,565,677};
printf("%d\n",recurbinary(a,45,0,20));
printf("%d\n",binary(a,3,21));
return 0;
}
原理:
(1)定义3个变量left, right, mid分别表示有序数组查找部分的起始位、结束位和中间位,若元素总个数为偶数,则中间位表示中间左边的那一位。
(2)判断mid和查找值key的大小关系,若key