1.题1
void print(char* s)
{if (*s){print(++s);printf("%c", *s);}
}
#include<stdio.h>
int main()
{char str[] = "Geneius";print(str);return 0;
}
上述代码是一个递归,那么它运行的结果是什么呢?
我们来分析一下:首先我们在main函数中创建了一个char类型的数组。 然后我们将str传给print函数,我们知道一维数组传参,其实是将它的首元素地址传过去,我们观看print函数,它的返回类型为void,有一个char*的参数。 进入函数,if的判断条件是*s也就是数组的元素是否为真,当我们的*s为'\0'时,就会跳出if语句,当我们跳出if语句时就已经将所有的“递”算完了,现在就要开始计算"归"了,此时就开始从后往前开始进行运算printf库函数了,如果此时我们将*s进行监视的话,就会发现*s就像自己会往回走一样,那我们的结果会不会就是反过来的字符串呢?
我们来看看:
可能有人就会疑惑不是说好的倒过来吗? 怎么少了一个G呢? 其实是因为我们的代码递归时候的参数为++s,前置 ++的运算规则是先+1后使用,这样的话当我们的*s就直接指向第2个字符了,所以我们的递归式子也会直接过滤掉第一个字符,所以在归的时候第一个字母就不会被打印。
我们如何让字符全部打印出来呢?其实改一下调用条件即可。
演示如下:
2.题2
int main()
{char arr[] = { 'a','b','\0','c','\0' };printf("%s",arr);
}
上述代码运行的结果是什么呢?
我们来分析一下:char类型的数组arr其元素中有‘\0’,我们思考一下%s打印字符串的规则是什么?应该是提供首元素地址打印到终止符吧。所以按照推理只会打印出ab两个字符。那么我们运行来看看:
3.题3
若有定义: int a[2][3]; ,以下选项中对 a 数组元素正确引用的是( )
A: a[2][0] B: a[2][3] C: a[0][3] D: a[1>2][1]
我们来分析一下:我们知道数组下标是从0开始的所以它的第一个下标小于2,第二个下标小于3。
故我们可以排除A,B,C但是D选项看上去也感觉有点问题,其实1>2这个不等式是不成立的,所以它的结果为0,故D选项是对的。
4.题4
#include<stdio.h>
int main()
{
int a [12]= {1,2,3,4,5,6,7,8,9,10,11,12},*p[4],i;
for(i=0;i<4;i++)
p[i]=&a [i*3];
printf("%d\n",p[3][2]);
return 0;
}
上述代码运行结果是什么呢?
我们来分析一下:我们定义了一个整型数组,一个整型指针数组,和一个整型变量。
然后利用for循环将整型数组每三个整型的方式,将它们的首元素地址存放在整型指针数组中,然后我们在打印的时候,使用到了整型指针数组,p[3]是找到它的第四个元素,也就是找到第四个三个一起整型的首元素地址,在通过[2],找到该整型数组的第三个元素,就是12。
我们运行看看:
如果大家有点不好理解的话,我们也可以换个方式理解,思考一下我们p[3]是找到它的第四个元素,并解引用其实就是10,然后我们的[2],其实就是将该地址加2再解引用,得到的就是12。
5.题5
输入数字和字符,输出从大到小排列(按照ASCLL大小排列)
#include<stdlib.h>
int main()
{char str[1024] = { 0 };gets(str);size_t n = strlen(str);for (int i = 0; i < n; i++){for (int j = 1; j < n-i; j++){if (str[j] < str[j -1]){char tmp = str[j];str[j] = str[j-1];str[j-1] = tmp;}}}printf(str);
}
大家也要多多动手,尝试尝试才能有更大的收获,当然这不是唯一正解,大家也可以发挥自己的想象。