C语言之指针详解(2)

目录

本章重点
1. 字符指针
2. 数组指针
3. 指针数组
4. 数组传参和指针传参
5. 函数指针
6. 函数指针数组
7. 指向函数指针数组的指针
8. 回调函数
9. 指针和数组面试题的解析
数组指针
数组指针的定义
数组指针是指针?还是数组?
答案是:指针
我们已经熟悉:
整形指针: int * pint; 能够指向整形数据的指针
浮点型指针: float * pf; 能够指向浮点型数据的指针
那数组指针应该是:能够指向数组的指针
我们来看代码
#include<stdio.h>
int main()
{
	//数组指针--指向数组的指针--存放数组的地址
	//arr-首元素的地址
	//&arr[0]-首元素的地址
	//&arr-数组的地址
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int(*p)[10] = &arr;//这里涉及到了()优先级
	return 0;
}
下面代码哪个是数组指针?
int* p1[10];
int(*p2)[10];
//p1, p2分别是什么?
int(*p)[10];
//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。
//这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合
我们来看下面代码,(*pa)表示这是一个数组指针,数组里面有10个元素,把数组的地址取出来放到pa里面,然后再*解引用操作又得到了原来的那个数组int arr[10],大家觉得这个方法是不是多此一举,我们的数组指针用在二维数组里面会更加合适
#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int(*pa)[10] = &arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(*pa + i));//这里的*pa == arr;
	}
	return 0;
}
我们再来看一下数组指针用于二维数组的情况
#include<stdio.h>
void print1(int arr[3][5], int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			printf("%d ", arr[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} };
	print1(arr, 3, 5);
	return 0;
}
这是常规操作打印二维数组的情况,数组名传参是可以直接拿一个数组来接收的,代码运行结果我们也可以看到结果正确
下面我们用指针数组来实现,看代码
这个代码是什么意思呢,首先我们知道二维数组的数组名也是首元素的地址,但是他并不是像一维数组里面的数组名一样是首元素的地址,这时我们想到在初始数组那篇博客讲到的把二维数组看成一个一维数组,所以二维数组的数组名就是首元素的地址也就是第一行一维数组的地址,然后后面我们遍历整个二维数组的时候就是第一行的地址加j先遍历第一行的元素,同理,第二行加j遍历第二行的元素,所以,这就是数组指针应用于二维数组的情况,希望大家能够理解
我把代码给大家,对代码的解释也附在代码后面了
#include<stdio.h>
void print2(int(*p)[5], int x, int y)
{
	int i = 0;
	for (i = 0; i < x; i++)
	{
		int j = 0;
		for (j = 0; j < y; j++)
		{
			printf("%d ", * (*(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} };
	//print1(arr, 3, 5);//arr--二维数组的数组名--数组名(首元素的地址),对于二维数组来说,它的首元素的地址是谁呢?这里我们应该把二维数组想象成一个一维数组,前面数组的讲解已经给大家讲到了,也就是表示二维数组第一行的地址
	print2(arr, 3, 5);
	return 0;
}
当然你也可以写成
p[i][j];
*(p[i] + j));
*(*(p + i) + j));
(*(p + i))[j]);

下面给大家四个代码来判断一下
看代码
int arr[5];----arr是一个5个元素的整型数组
int *parr1[10];----parr1是一个数组,数组有10元素,每个元素的类型是int*,parr1是一个指针数组
int (*parr2)[10];----parr2是一个指针,改指针指向了一个数组(10个元素),每个元素的类型为Int,parr2是一个数组指针
int (*parr3[10])[5];----大家先想一下这是个什么东西,其实parr3是一个数组,有10个元素,每个元素是一个数组指针,这个指针能够指向5个元素的这一个数组,每个元素是Int
本章终,谢谢支持!!!

猜你喜欢

转载自blog.csdn.net/fjj2397194209/article/details/131218005