1. 下面关于"指针"的描述不正确的是:( )
A.当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B.32位系统下任何类型指针的长度都是4个字节
C.指针的数据类型声明的是指针实际指向内容的数据类型
D.野指针是指向未分配或者已经释放的内存地址
答案解析:
A要了解free不会更改指针的指向。
B选项强调了32位系统,所以没问题。
CD选项是定义本身。
所以排除法也可以确定是A。
2. 关于下面代码描述正确的是:( )
char* p = "hello world";
A.把字符串hello world存放在p变量中
B.把字符串hello world的第一个字符存放在p变量中
C.把字符串hello world的第一个字符的地址存放在p变量中
D.*p等价于hello world
答案解析:
双引号引起来的这一段是一个常量字符串,本质是一个常量字符数组类型,赋给一个指针,相当于把一个数组的首地址赋给指针,即第一个元素h的地址。
只有选项C提到了第一个字符的地址,故选C
3. 关于数组指针的描述正确的是:( )
A.数组指针是一种数组
B.数组指针是一种存放数组的指针
C.数组指针是一种指针
D.指针数组是一种指向数组的指针
答案解析:
AD缩句后分别是:指针是数组、数组是指针,自相矛盾。B选项说的有问题,数组指针存放的是数组的地址,而非数组本身。故选C。
4. 下面哪个是数组指针( )
A.int** arr[10]
B.int (*arr[10])
C.char *(*arr)[10]
D.char(*)arr[10]
答案解析:
A是二级指针数组,B是指针数组,C是char *数组的指针,D是char *的数组。只有C是数组指针。
tip:根据优先级看只有C选项优先跟*结合,其他都不是指针,所以直接选C。
5. 下面哪个代码是错误的?( )
#include <stdio.h>
int main()
{
int *p = NULL;
int arr[10] = {0};
return 0;
}
A.p = arr;
B.int (*ptr)[10] = &arr;
C.p = &arr[0];
D.p = &arr;
答案解析:
就数据类型来看,A左右两边都是int *,B左右两边都是 int (*)[10],C左右两边都是int *,D左边是 int *,右边是 int (*)[10],故选D。
6. 下面代码关于数组名描述不正确的是( )
int main()
{
int arr[10] = {0};
return 0;
}
A.数组名arr和&arr是一样的
B.sizeof(arr),arr表示整个数组
C.&arr,arr表示整个数组
D.除了sizeof(arr)和&arr中的数组名,其他地方出现的数组名arr,都是数组首元素的地址。
答案解析:
A选项错误明显。arr的类型是int [10],而&arr的类型是int (*)[10],根本不是一个类型,不可能是一样的。而在 sizeof(arr)和&arr中,arr都是看成整体的,而一般它代表一个数组的首地址。
7. 如何定义一个int类型的指针数组,数组元素个数为10个:( )
A.int a[10]
B.int (*a)[10]
C.int *a[10];
D.int (*a[10])(int);
答案解析:
体面要int的指针数组,A为int数组,B为int数组的指针,C为int的指针数组,D为int(*)(int)函数指针的数组,故选C
8.下面代码的执行结果是( )
#include <stdio.h>
int main()
{
char str1[] = "hello world.";
char str2[] = "hello world.";
char *str3 = "hello world.";
char *str4 = "hello world.";
if(str1 == str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 == str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
A.str1 and str2 are same str3 and str4 are same
B.str1 and str2 are same str3 and str4 are not same
C.str1 and str2 are not same str3 and str4 are same
D.str1 and str2 are not same str3 and str4 are not same
答案解析:
str1和str2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,所以str1 != str2。而str3和str4是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,str3和str4指向的是同一个常量字符串,所以str3 == str4,故选C。
9. 字符串左旋
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
答案解析:
方法一:
#include<stdio.h>
#include<std
void left_move(char arr[], int k) {
int len = strlen(arr);
for (int j = 0; j < k%len; j++)
{
char tmp = arr[0];
for (int i = 0; i < len - 1; i++)
{
arr[i] = arr[i + 1];
}
arr[len - 1] = tmp;
}
}
int main()
{
char arr[20] = "abcdef";
int k = 0;
scanf("%d", &k);
lest_move(arr, k);
printf("%s\n", arr);
return 0;
}
方法二:
#include<stdio.h>
#include<string.h>
void reverse(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void lest_move(char arr[], int k)
{
int len = strlen(arr);
reverse(arr, arr + k - 1);
reverse(arr + k, arr + len - 1);
reverse(arr, arr + len - 1);
}
int main()
{
char arr[] = "abcdef";
int k = 0;
scanf("%d", &k);
lest_move(arr, k);
printf("%s", arr);
return 0;
}
9. 杨氏矩阵
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
答案解析:
#include<stdio.h>
void find_k(int arr[3][3], int k, int r, int c)
{
int x = 0;
int y = c - 1;
int flag = 0;
while (x < r && y >= 0)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
printf("找到了,下标是:%d %d \n", x, y);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("找不到");
}
}
int main()
{
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
int k = 7;
find_k(arr, k, 3, 3);
return 0;
}