这是第二天的作业,fighting!
Day 02
一、选择题
首先char* s[6]是指针数组,也就是其存储的都是这些字符串的地址,其实际上的类型为char**,而fun函数传入了s数组的首地址。而后续fun函数中打印字符,p[i]即*(p+i),我们也从之前的分析中发现了这个其实也就是一个二维数组,所以for循环打印的就是每行的字符串,也就是按照顺序打印0~3下标的字符串,故答案为ABCDEFGHIJKLMNOP
B可以转化为D,而B一看就知道是正确的,所以B和D可以表示a[1][1];而A,+5跳过五个元素的地址,故1 2 3 0 1,最后变成a[1][1];而C,&a[1]指的是第一行的地址,+1会跳过一整行元素,地址会变成a[2]这一行的首地址
void (*s[5])(int) 是C语言中的一个声明,它定义了一个名为 s 的数组,该数组包含5个元素,每个元素都是一个指向函数的指针。这些函数接受一个 int 类型的参数,并返回 void 类型。
这样的声明常常用于回调函数、函数表或其他需要动态或灵活地引用函数的场景。
举个例子:
#include <stdio.h> void printInt(int x) { printf("%d\n", x);
} int main() { void (*s[5])(int); // 声明一个包含5个函数指针的数组 s[0] = printInt; // 将第一个元素设置为指向printInt函数 s[0](10); // 使用数组中的第一个函数指针调用函数,输出10 return 0;
}
故结果很明显,答案为函数指针数组
这里定义的是一个10行30列的二维指针数组,其中的每个元素都是指针,而指针大小在64位操作系统上的大小是8个字节,所以sizeof(k)的大小为10308=2400,选D
现在,让我们分析每个选项:
A: f(a);
a 是一个整数数组,当数组作为函数参数传递时,它会被转换为指向其第一个元素的指针,即 int* 类型。这与 f 所期望的 int** 类型不匹配。
B: f(b);
b 是一个二维整数数组。当二维数组作为函数参数传递时,它会被转换为指向其第一行的指针,即 int (*)[4] 类型。这与 f 所期望的 int** 类型不匹配。
C: f(q);
q 是一个整数指针数组,每个元素都是一个指向 b 的某一行的指针。这与 f 所期望的 int** 类型匹配,因为 q 的类型实际上是 int* [3],它会被转换为指向其第一个元素的指针,即 int**。
D: f(&a);
&a 是数组 a 的地址,其类型是 int (*)[4],即指向包含 4 个整数的数组的指针。这与 f 所期望的 int** 类型不匹配。
综上所述,只有选项 C: f(q); 是合法的调用。
二、编程题
第一个只出现一次的字符
int FirstNotRepeatingChar(char* str ) {// write code hereint a[128]={0};int i=0,t;for(i=0;str[i]!='\0';i++){t=str[i];a[t]++;}for(i=0;str[i]!='\0';i++){t=str[i];if(a[t]==1){return i;}}return -1;
}
首先ASCII码值一共有128个,我们创建一个拥有128个元素的数组,并将其所有元素初始化为0;下一步我们遍历原数组,创建一个int型变量t用来存储原数组的每个元素值,并让数组a对应位置值+1;接下来再遍历一次数组,如果这个元素出现了几次,那么a[t]绝对不等于1,而以顺序遍历,所以第一个为1的值,其下标t一定是str中第一个只出现一次的值
判定字符是否唯一
bool isUnique(char* astr){int a[128]={0};int i=0,t;for(i=0;astr[i]!='\0';i++){t=astr[i];a[t]++;}for(i=0;astr[i]!='\0';i++){t=astr[i];if(a[t]!=1){return false;}}return true;
}
这里我们可以使用上面的方法,是可以解决的,其实就是换了一个判断条件