【820复试】C语言笔试

1.正整数和负整数取非运算都是0。
2.对于指针的运用
int a[]={1,7,12,15};
int *p1 = a, *p2 =p1++;
*p1 += *p2++;
printf("%d %d",*p1, *p2);
//8 8

p1 = a;//正确书写方式 表示将p1指针指向a数组的首地址
p2 = p1++;//表示p2指针指向p1自加后的位置,即a数组的第二个位置

// * 和 ++ 的优先级相同
//但是由于是后++ 所以 *p1 = 1+7 = 8 此时 *p2 = 7+1 = 8

*p–的含义是什么?e.g:

int a[]={1,2,3,4};
int *p = a+2; 
//此时p指向a数组中的3
prinf("%d",*p--);
//此时输出3
//但是p指向的是a数组中的2。
#include <stdio.h>

int func(int *q){
	return (*q--=3)-1;
}
int main()
{
	int a[]={10,7,5};
	int *p=a+1;
	printf("%d",func(p)+*p); //2+3 = 5
    return 0;
}
//为什么输出的是5?
//不是移动了p的指向了吗?
原因是:移动的是形式参数q的指针,而不是实际参数p的指针,对main函数中的p指针没有影响!!
总之会改变指针指向的地址的元素数值,即*q--=3导致了q指向的7变化为3并改变q的指针指向数组a的第一个元素。但是并没有改变p指针指向,即p指针仍指向a数组的第二个元素,但此时a数组的第二个元素已变化,所以是2+3=5
3.switch中的奇怪应用
int i =1 ;
switch(i){
    printf("Hello"); //warning: statement will never be executed 警告:该语句永远不会被执行
    case 1: printf("Hi ");
    case 2:printf("Bye");
}
//所以会输出 Hi Bye
4.两个文件指针指向同一个文件

同时指向文件头,但是执行顺序不同会导致最终文件内容不同

FILE *p1, *p2;
p1 = fopen("test.txt","w");
p2 = fopen("test.txt","w");
fputc('A',p1);
fputc('B',p2);
fclose(p1);
fclose(p2);
//最终文件test.txt中的内容是B
//因为B会覆盖掉第一次写入的A
//指针头不会同步变化~
5.ASCII码基础

char c=48; 立即推输出printf(“%c”,c);时,会输出的是0,

空格→ASCII→32

'a’→ASCII→97

'A’→ASCII→65

'0’→ASCII→48

补充:或运算是将字符或八进制或16进制转换成二进制然后逐位相与。

八进制的表示方法如: int hhh = 01;

十六进制的表示方法如:int bbb = 0x1;

int hhh = 011;
int bbb = 0x11;
printf("%d %d",hhh,bbb); //9 17
6.运算符优先级

转自:http://blog.csdn.net/huangblog/article/details/8271791
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
优先级高的先执行,否则就是看运算符规则

! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

记住优先级为1的运算符就好。要先执行就要加括号

如 *p.num 即结构体引用,这种引用是错误的。应该是(*p).num才正确。

7.要利用函数改变一般参数的值,一定要将地址传递过去
//e.g:
//1.
swap(&a,&b); //交换a和b的值

//2.
int a[] = {1,2,3}
change(a); //通过change()函数改变a的值

//3.
int *p = a; //指向a数组
reverse(p,0,len(a)); //将p的地址传递过去 翻转数组
void reverse(int a[], int i, int n);
8.指针数组
char *point[]={"one","two","three","fourth","five"};
//point[0],point[1]...point[4]都是指向对应字符串首地址的指针
//所以可以进行运算
//如:
point[2]=point[3]; //赋值运算
point[2] += 2; //移动指针
//移动后 输出point[2]即为"urth"
9.笔试题目中直接声明 int len=5, dat[len]; 属于错误声明 会报错
10.注意函数代码写的是什么【在选择题求结果/找错题中出现】
void reverse(int a[], int n){
    for(int i=0; i<n; i++){
        int t = a[i];
        a[i]=a[n-1-i];
        a[n-1-i]=t;
    }
}
//上面这个函数表面上是一个翻转函数,实际上将数组对换了两边,从而数组相当于没有变化

正确写法: 将 i<n 改为 i<n/2即可
11.字符串中strlen()是不计入最后的终止符的长度的
#include <stdio.h>
#include <string.h>
int main()
{
	char a[]="\0";
	printf("%d",strlen(a)); //输出 0
    return 0;
}
  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值