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