帮你捋值复杂指针(指针数组,数组指针 函数指针,函数指针数组)

Posted 两片空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了帮你捋值复杂指针(指针数组,数组指针 函数指针,函数指针数组)相关的知识,希望对你有一定的参考价值。

1.指针数组

- 表现形式
类型+*+数组名+[常量表达式]
例如:

int *arr[5];

- 定义

指针数组实际是数组,里面的元素都是指针。
例如:

int *arr[3]={&a,&b,&c};
arr[0]=&a,arr[1]=&b,arr[2]=&c
*arr[0]=a,*arr[1]=b,*arr[2]=c
#include<stdio.h>
int main(){
	int a = 1;
	int b = 2;
	int c = 3;
	int *arr[3] = { &a, &b, &c };
	printf("%p\\n", &a);
	printf("%p\\n", arr[0]);
	printf("%d\\n", *arr[0]);
	return 0;
}

输出:
在这里插入图片描述

2.数组指针

- 表现形式
类型+(*+数组名)+[常量表达式]

例如:int (*arr)[5];

- 定义
实际是指针,能够指向数组的指针。

- 用途
使用在指向一个多维数组,一般用在多维数组传参。
我们知道多维数组都可以看作是一维数组,只是里面的元素也是一个数组。用二维数组举例,看做一维数组后,里面的元素是一维数组。二维数组的数组指针的指向里面那个数组的指针。

  1. 数组指针指向多维数组:
	#include<stdio.h>	int main(){

		int a[3][3] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } };
		int(*p)[3] = a;//指向二维数组后,写法
		printf("%p\\n", &a);//整个数组最低的地址
		printf("%p\\n", p);//看作一维数组后,里面一维数组的最低地址,所以两个地址相同。


		printf("%p\\n", &a[1][0]);
		printf("%p\\n", &p[1][0]);
		
		printf("%p\\n", p[1]);
		printf("%p\\n", p + 1);//与上面两个地址相同,指向下一行的第一个元素地址。
		return 0;
	}

输出:
在这里插入图片描述

仔细观察上面代码:
二维数组可以看作一维数组,里面由一个一维数组组成,而数组指针p指向的是里面那个一维数组的指针,p是里面一位数组的地址,*p是里面元素的地址,**p里面的元素。上面可以看出 p[i][j]=a[i][j]。

#include<stdio.h>
int main(){
	int a[2][2] = { 1, 2, 3, 4 };
	int(*p)[2] = a;
	int i = 0;
	for (; i < 2*2; i++){
		printf("%d\\n", *(*p + i));
	}
	return 0;
}

输出:

1
2
3
4

*注意:int(p)[3] = &a;数组指针中括号里的数值要与数组数值一样。

  1. 数组指针传参
#include<stdio.h>
void print(int(*arr)[3], int x, int y){  //也形参可以写成int arr[][3],只有前面括号可省略
	int i = 0;
	for (; i < x; i++){
		int j = 0;
		for (; j < y; j++){
			printf("%d ", arr[i][j]);
		}
	}
}


int main(){
		int a[3][3] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } };
		print(a, 3, 3);
		return 0;
}

3.函数指针

首先看一代码:

#include<stdio.h>
void print(int(*arr)[3], int x, int y){
	printf("hellow\\n");
}



int main(){
	printf("%p\\n", print);
	printf("%p\\n",&print);
	return 0;
}

输出:
在这里插入图片描述
仔细看上面代码发现,函数也是具有地址的,并且print与&print 代表含义相同。
由于函数的调用会在内存开辟空间,上面显示的地址为函数开辟空间的第一个地址。所以我们也可以用指针来保存函数的地址,即函数指针。

- 表现形式
类型+(*名称)+();

例如:int(*p)();

- 定义
指向函数的指针。

- 用途
可以用来指向函数

#include<stdio.h>
int Add( int x, int y){
	return x + y;

}

int main(){
	int(*p)() = Add;//Add也可以写成 &Add
	printf("%d\\n", p(1, 2));
	printf("%d\\n", (*p)(1, 2));//两种写法相同
	return 0;
}

输出:
在这里插入图片描述

4.函数指针数组

- 表现形式
类型+(*名字[常量表达式])+();

例如:int (*p[5])();

- 定义
一个数组里的元素为函数指针类型,为函数指针数组。

- 用途

假如 add,sub为两个函数。add(int x,int y),sub(int x,int y)
定义一个函数指针数组:
int (*p[2])(int x,int y)={add,sub};//函数指针数组后面括号里是参数。
此时:(*p[0])(1,2)=add(int 1,int 2), (*p[1])(1,2)=sub(int 1,int 2).相当于调用了这两个函数。

以上是关于帮你捋值复杂指针(指针数组,数组指针 函数指针,函数指针数组)的主要内容,如果未能解决你的问题,请参考以下文章

20145309信息安全系统设计基础第12周学习总结后篇

c复杂函数指针

c函数指针数组

c函数指针数组

第八章 指针实验

第八章指针实验