1.
#include <stdio.h>
void fun(char **p)
{
int i;
for(i = 0; i < 4; i++)
printf("%s", p[i]);
}
int main()
{
char *s[6] = {"ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX"};
fun(s);
printf("\n");
return 0;
}
上述代码运行结果是什么呢?
A: ABCDEFGHIJKL B: ABCD C: AEIM D: ABCDEFGHIJKLMNOP
答案为D.
char *s[6]={ "ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX" }; 以上语句定义了一个字符指针数组s。首先这是一个数组,这个数组里存储的是字符指针,也就是说s[1], s[2] ...等存储的都 是字符指针,类型是 char*。而数组名是指向第一个元素的常量指针,因此s是指向指针的指针,所以函数fun的形参定义是 char **。fun(s)将指针s的值传递给形参p,所以p = s,因此for(i=0;i<4;i + + )printf("%s",p[i]);中printf("%s",p[i])等价于 printf("% s",s[i])。注意,虽然s[i]中存储的不是字符串,而是char*类型的指针,printf在按照%s形式打印字符串的时候, 看到s[i]中存放的地址,输出s[i]存储的指针指向的字符串。所以最后输出为D
2.
数组 a 的定义为: int a[3][4]; 下面哪个不能表示 a[1][1] ( )
A: *(&a[0][0]+5) B: *(*(a+1)+1) C: *(&a[1]+1) D: *(a[1]+1)
答案为C
在二维数组中a[1]是第一行的数组名,数组名表示首元素的地址,即a[1][0]的地址,所以a[1]+1表示的是a[1][1]的地址,所 以D可以取得正确的值;指针操作*(a+1)与a[1]等价,所以B也可以取得正确的值;二维数组在内存中连续存储,所以A中 a[0][0]的地址加5可以取得正确值;C选项错误,应改为*(&a[1][0]+1),因为a[1]就表示a[1][0]的地址.
3.
void (*s[5])(int) 表示意思为( )
A: 函数指针 B: 函数指针数组 C: 数组指针函数 D: 语法错误
答案为B
这是一个标准的函数指针数组,s先与[5]结合,说明s是一个数组,数组的元素是void (*)(int)类型的函数指针,该指针指向 的函数参数为int,返回值为void
4.
int main()
{
int *k[10][30];
printf("%d\n", sizeof(k));
return 0;
}
在64位操作系统上运行上述代码运行结果是什么呢?
A: 4 B: 8 C: 1200 D: 2400
答案为D
int *k[10][30];表示的是指针数组,一共有10*30=300个元素,在64位系统下,每个指针的长度是8字节,因此总长度为 2400字节 .
5.
void f(int **p);
int a[4]={1,2,3,4};
int b[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *q[3]={b[0],b[1],b[2]};
假设函数原型和变量说明如上,则调用合法的是( )
A: f(a); B: f(b); C: f(q); D: f(&a);
答案为C
A选项,f(a)传参时,a会退化成指向其首元素的地址,类型是 int*,不符。B选项,b是二维数组,传参时会退化成指向其首 元素的指针,也就是b[0]的地址,b[0]的类型是int [4],故&b[0]类型是int(*)[4],不符。D选项,&a是数组a的地址,其类型是 int(*)[4],不符。C选项,q是一个指针数组,在初始化时用b[0]、b[1]、b[2], 此时b[0]、b[1]、b[2]会退化成指向各首元素 的指针(int* 类型,因此类型符合,可以用它们初始化)。q传参时,退化成指向其首元素的指针,即 int**,符合
6.、在一个字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1 (需要区分大小写).(从 0 开始计数) 数据范围: 0≤*n*≤10000 ,且字符串只有字母组成。 要求:空间复杂度 O(n) ,时间复杂度 O(n)
int FirstNotRepeatingChar(char* str ) {
// write code here
//小写字母[a, z]-[97,122], 大写字母[A, Z]-[65,90]
char table[128] = {0};//以字符ascii值为下标,存放各个字符出现的次数
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (table[str[i]] < 256)//防止字符出现次数过多,导致溢出截断
table[str[i]] += 1; //以字符ascii值为下标,对应位置次数+1
}
//从第0个字符开始在表中查看对应字符的出现次数,第一个次数为1则找到
for (int j = 0; j < len; j++) {
if (table[str[j]] == 1){
return j;
}
}
return -1;
}