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

本文探讨了指针的正确使用,包括指针的内存管理、数据类型定义、野指针概念,以及关键代码片段的分析。重点讲解了数组指针、函数指针和整型指针数组的定义,同时提供了一段解决递增矩阵查找的高效算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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]<find)
		{
			x++;
		}
		// 先在那一行最后比它大或者等于它。开始向左找
		while (tiaojian&&arr[x][y] > find)
		{
			y--;
		}
		// 找完:它处于小于它或者等于它,等于就不执行了,小于它时,继续往下走
		while (tiaojian&&arr[x][y]<find)
		{
			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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值