栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言1.指针(进阶)作业(一):函数指针、数组指针、函数指针数组 ,杨氏矩阵,左旋字符串

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言1.指针(进阶)作业(一):函数指针、数组指针、函数指针数组 ,杨氏矩阵,左旋字符串

  1. 关于指针描述不正确:
    a. free释放掉一个指针内容后,指针变量的值被置为NULL
    B.32位系统下任何类型指针的长度都是4个字节
    C.指针的数据类型声明的是指针实际指向内容的数据类型
    D.野指针是指向未分配或者已经释放的内存地址
    解释:a. free后,指针还指向原来地址,但free是为告诉系统这片内存地址可再分配,已被收回。
    C 指针的数据类型,不是为了自己,自己作为指针,在它之前标记的是心中所存内容的类型。
  2. 关于下面代码描述正确的是:( )
    char* p = “hello bit”;
    存的是常字符串"hello bit"的首字母地址
  3. 下面哪个是数组指针( )
    A.int** arr[10]
    B.int (arr[10])
    C.char *(*arr)[10]
    D.char()arr[10]

C 数组指针:指向数组,且数组存的是字符指针char *,每个数组大小为10

如果写为 char (*arr)[10],也是数组指针,数组大小为10,所存是是char字符

  1. 下面哪个是函数指针?( )
    A.int* fun(int a, int b);
    B.int(*)fun(int a, int b);
    C.int (*fun)(int a, int b);
    D.(int *)fun(int a, int n);

函数指针:
返回类型 (*p_name)(parse1, parse2) = &fun;
函数指针、数组指针,都是(*p)

  1. 函数指针指向的函数有两个int形参并且返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数?下面哪个是正确的?( )
    A.int (*(*F)(int, int))(int)
    B.int (F)(int, int)
    C.int ((F)(int, int))
    D.(*F)(int, int)(int)

B是错的,A
它是一个函数指针: (*F)(int , int)
如果简单的函数指针,返回int,参数int, int (*F) (int ,int)
当它要返回一个函数指针,所以再加个*
而返回的函数指针的返回值是int,所以外面加int,且形参是int
所以 int (*(*F)(int, int))(int)

  1. 数组指针D用错了,B很标准


如何定义一个int类型的指针数组,数组元素个数为10个:( )
A.int a[10]
B.int (*a)[10]
C.int *a[10];
D.int (*a[10])(int);

B:肯定对,
C:a和[10]先结合,剩余是内容:int *所以它是指针数组
D: a[10]是数组,加*表示它装着函数,装着的函数返回int,参数int。总之,函数指针数组,其中指针二字只是解释,因为所存必须是地址,所以它是个函数指针。

  1. 杨氏矩阵
    有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
    要求:时间复杂度小于O(N);

按照右下左的顺序

int matrixFind(int arr[][5], int find, int row, int col)
{
	int x = 0;
	int y = col - 1;
	int tiaojian = 0 <= x && x <= row - 1 && 0 <= y && y <= col - 1;
	if (tiaojian)
	{
		printf("进来了n");
		// 先找到它该在的那一行,向下走
		while (tiaojian&&arr[x][y]
			x++;
		}
		// 先在那一行最后比它大或者等于它。开始向左找
		while (tiaojian&&arr[x][y] > find)
		{
			y--;
		}
		// 找完:它处于小于它或者等于它,等于就不执行了,小于它时,继续往下走
		while (tiaojian&&arr[x][y]
			x++;
		}
		// 此时,应该等于它或大于它,大于继续向左走
		while (tiaojian && arr[x][y] > find)
		{
			y--;
		}
	}
	if (arr[x][y] == find) { return 1; }
	else { return 0; }
}


int main()
{
	int arr[3][5] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150};
	int(*p)[5] = arr;
	int find = 0;
	scanf("%d", &find);
	// 按照每一行最右边,再左,再
	int res = matrixFind(arr,find,3,5);
	printf("结果为:%d", res);
	return 0;
}
  1. 左旋k:
    把字符串前k个一个一个往后放
 左旋:

char* zuoxuan(char *left, char *new, int k, int sz)
{
	int  pos = 0;
	// k~sz-k-1
	char* t = left;
	for (int i = 0; i <= sz-k-1; i++)
	{
		new[i] = *(left+k);
		left++;
	}
	// sz-k~sz-1
	for (int i = sz-k;i<=sz-1; i++)
	{
		new[i] = *t;
		t++;
	}
	// 分两端赋值
	// 0~sz-k-1 = k~sz-1
	// sz-k = 0~k-1;
	return new;
}

int main()
{
	char s[] = "hello";
	int sz = strlen(s);
	int k = 0;
	scanf("%d", &k);
	char new[101] = { 0 };
	char * res = zuoxuan(s, new, k, sz);
	printf("%s", res);
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920664.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号