【好题分享】适合C++初学者(字符指针)

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨笨同学‍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值