C语言刷题笔记之基础不牢地动山摇 <一>
个人主页:欢迎大家光临——>沙漠下的胡杨
各位大帅哥,大漂亮
如果觉得文章对自己有帮助
可以一键三连支持博主
你的每一分关心都是我坚持的动力
![]()
☄: 本期重点: 一些C语言刷题易错点总结
希望大家每天都心情愉悦的学习工作。
一. 关于全局变量
二.关于scanf
三.指针练习
四. "A"和 'A' 的区别
五.关于数据的存储
六.关于二维数组
七.运算符优先级
一. 关于全局变量
全局变量定义之前无法使用吗?
extern int a;int main(){printf("a = %d\n", a);return 0;}int a = 10;
我们看一下,首先int a 的定义是在main函数之后的,通过声明是可以使用的。
本质:首先全局变量在程序运行时就已经被分配了内存空间,所以定义前可以被使用。
二.关于scanf
在横线处加入合适的输入语句,在程序运行时期从键盘输入:How are you?,最后输出的结果是: How are you?How
int main(){char *a = "How are you?", b[20]; ——————————————————————————————printf("%s %s\n", a, b);return 0;}
A:gets(b) B:scanf("%s",b)
gets的结束是换行( '\n' )
scanf结束是空格 回车 Tab键,也就是一个连续的字符。
所以应该选择 B:scanf("%s",b)
三.指针练习
int a[10] = { 1, 2, 3, 5, 5, 6, 7, 8, 9, 10 };int x = 0;int *pa = a;
有上面的定义,则下面的赋值中,哪一个不是把数组下标为3的元素赋值给x呢?
A:x = pa[3] B:x= *(a+3)
C: x =a[3] D:x = *pa+3
分析下:
A:正确,pa虽然是指针,但是可以通过数组的形式访问。
B: 正确 ,a是首元素地址,先后移动3个int的大小,刚好访问到下标为3的元素,在解引用赋值
C: 正确,通过数组形式,把下标为3的值赋值给x了。
D: 错误,首先是直接解引用了a就是数组的首元素,然后在+3,这个是不正确的。
四. "A"和 'A' 的区别
首先字符 'A' 是一个单独的字符,而"A"是两个字符,A 和 \0,他们是不一样的。
五.关于数据的存储
直接看代码:
unsigned short A = 10;printf("~A = %u\n", ~A);char c = 128;printf("c = %d\n", c);
我们分析下A:
存入A空间中是00000000 00001010 , 然后对A进行按位取反变成11111111 11110101
然后按照%u打印,就是按照无符号整形打印就是11111111 11111111 11111111 11110101
打印结果就是4294967285
接着分析c :
c是128,存入空间为10000000,是%d打印,所以整形提升为
11111111 11111111 11111111 10000000,这是补码,
转化为反码10000000 000000000 00000000 01111111
原码为10000000 000000000 00000000 10000000,
最后打印就是-128
六.关于二维数组
下面输出的结果:
char arr[2][4];strcpy(arr[0], "you");strcpy(arr[1], "me");arr[0][3] = '&';printf("%s \n", arr);
我们先分析下:
第一次拷贝后放得数据为,
第二次拷贝后放得数据为,
这时候我们如果直接以%s打印的话,那么就会打印到 '\0'结束,但是我们进行了赋值操作,把arr[0][3]中 '\0',替换为 ' $ ', 所以结果为 " you&me "。
七.运算符优先级
*p++ 是自增指针 p 还是自增指针 p 所指向的内容?
看个代码:
int a = 10;int *p = NULL;int pp = NULL;p = &a;pp = &p;printf("%d\n", *pp);printf("%d\n", *p++);printf("%d\n", *pp);
我们直接运行下可以得出,是自增的是指针变量p。
有两个流派的解释:1.在C和指针中解释为,同优先级下,结合性为从右向左。
2.在优先级图示上,为后置++的优先级高于解引用( * )。
这个我们讨论区来讨论吧!
创作打卡挑战赛
赢取流量/现金/CSDN周边激励大奖