指针与数组综合

概念区分

指针就是地址,一般口头上也表示指针变量,指针变量用于存放地址,大小为4或8

数组用于存放一组数据,大小取决于元素的个数和类型

补充说明

数组名表示的是首元素的地址(有例外),可存放在指针变量中

例外:sizeof(数组名)  计算整个数组的大小,注意若不是单独出现数组名则为首元素地址

&数组名  取出的是数组的地址,与首元素的地址的值一样,但是类型和意义不一样,体现在与整数的加减运算过程中

指针数组

是用于存放指针的数组,可类比字符数组、整型数组,本质是数组

应用于模拟二维数组

#include <stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };

	int* arr[] = { arr1,arr2,arr3 }; //此处即指针数组的表示形式,数组的每个元素为指针

	return 0;
}

数组指针

是指向数组的指针,本质是指针

应用:二维数组传参

void print(int (*p)[5], int r, int c)
//此函数的第一个形参即数组指针,接收的是数组的首元素地址
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", p[i][j]); //此处的p[i][j]也可理解为*(p+i)[j]
		}
		printf("\n");
	}
}

int main()
{
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	print(arr, 3, 5);

	return 0;
}

下面是一些练习题

练习1:
#include <stdio.h>
//求解运行结果
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a));//1
    printf("%d\n",sizeof(a+0));//2
    printf("%d\n",sizeof(*a));//3
    printf("%d\n",sizeof(a+1));//4
    printf("%d\n",sizeof(a[1]));//5
    printf("%d\n",sizeof(&a));//6
    printf("%d\n",sizeof(*&a));//7
    printf("%d\n",sizeof(&a+1));//8
    printf("%d\n",sizeof(&a[0]));//9
    printf("%d\n",sizeof(&a[0]+1));//10
}

可以先自行做一下再往下划,后面就是解析啦

---------------------------------------------------------------

下面是解析(以下单位均为字节)

1. 数组名单独放在sizeof内部,表示整个数组的大小,即4*4=16

2. 数组名非单独放在sizeof内部,表示首元素地址,为4或8(4还是8取决于x86还是x

64环境)

3. 数组名非单独放在sizeof内部,表示首元素地址,*a即首元素,为4

4. a+1等价于&a[1],表示数组第二个元素的地址,为4或8

5. 表示第二个元素大小,为4

6. 表示整个数组的地址的大小,注意首元素地址和整个数组地址的值相同,但类型不同,为4或8

7. &a为整个数组的地址,解引用为整个数组,此处翻译为整个数组的大小,为16

8. 表示的是a数组后一个数组的地址,为4或8

9. &a[0]表示首元素的地址,为4或8

10. &a[0]+1表示第二个元素的地址,为4或8

练习2:

题目:

有一个数字矩阵(二维数组),矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

eg.

1 2 3 4 5

2 3 4 5 6

3 4 5 6 7

要求:时间复杂度小于O(N);

---------------------------------

解析

杨氏矩阵满足规律:最小元素在左上角,最大元素在右下角。而对于右上角和左下角,都有一个方向比它大或比他小,这就是本题的突破口

以右上为例,若大于要求数字则向左一个数比较,若小于要求的数字则向下移一行比较

代码呈现

#include <stdio.h>

#define ROW 5
#define COL 5

int isexist(int (* arr)[COL], int goal)
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = COL - 1; j >= 0; j--)
		{
			if (arr[i][j] > goal)
				continue;//左移
			else if (arr[i][j] < goal)
				break;//下移
			else if(arr[i][j] == goal)
				return 1;
		}
	}
	return 0;
}

int main()
{
	int Map[ROW][COL];
	for (int i = 0; i < ROW; i++)
	{//初始化矩阵
		for (int j = 0; j < COL; j++)
		{
			Map[i][j] = i + j + 1;
		}
	}


	int goal = 0;
	printf("请输入要找的数>");
	scanf("%d", &goal);

	if (isexist(Map, goal))
		printf("找到啦\n");
	else
		printf("找不到\n");

	return 0;
}

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值