概念区分
指针就是地址,一般口头上也表示指针变量,指针变量用于存放地址,大小为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;
}