C语言基础题总结(操作符和指针)(含解析)
一,操作符类型
1,前置++和后置++的运用

分析:
++a: a先++在将a进行赋值 a++:先赋值,再将a的值加1
第一步:c=6,a=6;
注意:第二步不是逗号表达式只有在等号的后面加上()才是逗号表达式,b=++c是一个整体
第二步:c=7,b=7,c=8,a=7,a=8
第三步:b=b+a+c=7+8+8=23,a=9
综上:a=9,b=23,c=8
答案:B
2,操作符的优先级和结合性

分析:
只有优先级和结合性,不能确定唯一路径,在不同的编译器中的结果不同。
在VS中的结果为:4+4+4=12
在gcc中的结果为:2+3+4=9
答案:D
3,求两个整数的二进制中的不同位的个数

4.打印整数二进制的奇数位和偶数位

分析:
奇数:开始时向右移动30位得到从左到右的第一个奇数位(奇,偶按照从右到左顺序规定),最低1位也不用移动,和1进行&就能打印该位。
偶数同理。
5,单身狗1


6,求0~100000之间的水仙花数
水仙花数:一个n位数,各位上的数字的n次方之和等于该数
例如:如:153=1^3+5^3+3^3
int main()
{
int i = 0;
for (i = 0; i <= 100000; i++)
{
int w = i;
int m = i;
int n = 1;
while (w / 10 != 0)
{
w /= 10;
n++;
}
int j = 0;
int count = 0;
for (j = 1; j <= n; j++)
{
int a1 = m % 10;
int a2 = m / 10;
m = a2;
int k = (int)pow(a1, n);
count = count + k;
}
if (count == i)
{
printf("%d ", i);
}
}
return 0;
}
7,整型提升的运用

分析:
首先全局/静态整形变量的初始化为0,局部整形变量的初始化值为任意值。
故i的值为0,i--变为-1,i的类型为有符号的整型,sizeof的返回值为unsigned int 为无符号类型。
有符号整型和无符号整型进行比较时,有符号整型需要转化为无符号的整型。即整形提升,-1的二进制为1111111111111(32个1)去掉符号为一个非常大的数。故大于sizeof(i)。
答案:D
8,在杨氏矩阵中查找元素
杨氏矩阵:矩阵中的每一行元素从左到右依次递增,每一列元素从上到小依次递增。

9,猜凶手


首先字符加数字是在ASCII码值上加,在返回对应字符。a+1=b,b+1=c。以此类推
通过分别假设a,b,c,d为凶手,判断四句话,当有三句话为真时,则假设成立。
10.杨辉三角


11,单身狗2


分析:
要在数组中找到两个单独的元素,可以先整体异或(相同元素的异或值为0,0异或n为n),找到两个单独元素的异或值,这个异或值二进制中的1表示该为上两个元素的值不一样。通过该位在数组中分离两个不同的单独元素,分离后的元素进行异或得到单独元素。
12,在屏幕上用*打印菱形


实现分析:将整体分为两部分(上半和下半),一个*数目递增,一个*数目递减。每一行先打印空格在打印*
13,模拟实现strcpy(字符串拷贝 )

循环到“ ”时中止的原因:赋值表达式的值为所要赋的值,“ "的ASCII码值为0,故表达式的值为0,循环终止。
while (*p1++ = *c2++)
{
;
}
可以简化为while(*p1++=*c2++);
二,指针类型
1,字符串逆序

分析:
gets函数为读取整行字符串的库函数,从键盘上读取一行字符串,放到arr中,直到遇到换行符 或EOF,使用while循环后,可利用换行符' '读取多行字符串。
语法原型: char* gets(char* str)
2,左旋字符串
实现一个函数,可以左旋字符串中的k个元素。
例如:abcd 左旋2->cdab 左旋3->dabc 左旋4->abcd
分析:对于一个字符串,左旋的次数为字符串个数时,会和未旋转时一样。表明左旋具有周期性。
当旋转多次时,可以通过:次数/周期(长度)=实际次数。以实际次数进行旋转。
(1),平移法

(2),利用strcpy和strncat库函数
strcpy(str1,str2),将str2中的内容拷贝到str1当中。
strncat(str1,str2,k)将str2中的前k个字符拼接到str1当中
strcat(str1,str2)将str2中的全部字符拼接到str1当中

(3),逆序法
分析:对"abcdef"左旋2个字符串变成cedfab:先对ab进行逆序:bacdef,在对cdef进行逆序:bafedc,最后对整体逆序:cdefab。

3,调整数组,使得奇数全部位于偶数前面。

4,写一个函数,判断字符串是否为另一个字符串旋转后的结果

分析:srtcmp是比较两个字符串的函数,头文件为#include
(2)

分析:
strstr函数
头文件:
语法:strstr(str1,str2)
在str1中找str2,找到返回str1中的str2以及str1之后的字符,找不到返回NULL
5,判断函数指针

分析:
通过题目,知道总体是一个函数指针,这个函数指针有一个int形参并且返回值是int类型的。排除D
B,是一个函数指针排除
接着看函数内部,是一个函数指针,有两个int形参。
故总共有三个int形参,排除C
A,内部是一个题目要求的函数指针,外部int(*X)(int)也满足要求。
3,补充内容
1,求n的k次方:
头文件#include
pow(n,k)
2,比较字符串
头文件#include
strcmp(str1,str2)
当str1>str2时,返回正数,当str1 字符串比较规则:比较对应位的ASCII码值,当一方大于另一方时,就不用比较后面的部分了。 例如: abcef>abcdf abc>ab ag >abcde











