每日一刷-(4-11)

1.用指针数组模拟打印二维数组

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a1[] = { 1,2,3,4,5 };
	int a2[] = { 2,3,4,5,6 };
	int a3[] = { 6,3,4,5,7 };
	int* parr[3] = { a1, a2, a3 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", *(*(parr + i) + j));
		}
		printf("\n");
	}
	system("pause");
	return 0;
}

2.写一个函数,打印一维数组的内容(要求形参写成三种形式)

#include<stdio.h>
#include<stdlib.h>
void print1(int arr[], int sz)//这里arr数组的首元素地址传递过来,指定不指定数组大小无所谓,只是接收地址而已
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void print2(int* str, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ",*(str + i));
	}
	printf("\n");
}
void print3(int(*p)[10], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(*p+i));//*p<==>数组名<==>数组首元素地址
	}
	printf("\n");
}
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print1(arr, sz);
	print2(arr, sz);
	print3(&arr, sz);//传递整个数组地址

	system("pause");
	return 0;
}

3.写一个函数打印二维数组内容,形参两种方法接受。

#include<stdio.h>
#include<stdlib.h>
void print1(int arr[][5], int row,int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
void print2(int(*p)[5], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");
	}
	printf("\n");

}

int main()
{
	int arr[3][5] = { { 1,2,3,4,5 },{ 2,3,4,5,6 },{ 3,4,5,6,7 } };
	print1(arr, 3, 5);
	print2(arr, 3, 5);
	system("pause");
	return 0;
}

4.读程序

int(*parr3[10])[5];

请分析上面这一行代码:

首先parr3[10]表示一个数组,这个数组里面有10个元素,每个元素的类型是int(*)[5],也就是说数组中存储着10个数组指针(10个数组的地址),每个数组都有五个元素,每个元素类型是int。

5.读程序(判断调用下面哪个test函数书写正确)


void test(int* arr)//指针,可以接受一维数组名的传递。
{;}
void test(int* arr[5])//指针数组
{}
void test(int (*arr)[5])//数组指针,二维数组名传递过来的本质是行指针,因此用数组指针接受来说是正确的
{}
void test(int** arr)//二级指针可以接受传递过来的指针数组
{}
int main()
{
	int arr[3][5] = { 0 };
	test(arr);
	return 0;
}

6.自定义函数中形参是一级指针,那么实参有可能是什么呢?

void test(int* p)
{}
int main()
{
	int a = 10;
	test(&a);//整型地址
	int* p = a;
	test(p);//一级指针
	int arr[10] = { 0 };
	test(arr);//一维数组数组名
}

自定义函数中形参是二级指针,那么实参有可能是什么呢?

void test(int** p)
{}
int main()
{
	int a = 10;
	int* p = &a;
	int** pc = &p;
	test(&p);//指向指针的指针
	test(pc);//
	int* arr[10] = { 0 };
	test(arr);//指针数组数组名代表首元素地址,而首元素也是一个地址
}

7.写一个函数,交换两个值

//写一个函数,交换两个值
#include<stdio.h>
#include<stdlib.h>
void Swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前a=%d, b=%d\n", a, b);
	Swap(&a, &b);//注意不要直接把a和b的值传递过去,对形参的改变不会影响实参。
	printf("交换后a=%d, b=%d\n", a, b);
	system("pause");
	return 0;
}

8.利用二分法去查找数组中的一个数字

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int binary_search(int arr[], int k, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		if (arr[mid] == k)
		{
			return mid;
		}
	}
	return -1;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int k = 0;
	scanf("%d", &k);//输入要查找的元素
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = binary_search(arr, k, sz);
	if (-1 == ret)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标为%d\n", ret);
	}
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值