帮你捋值复杂指针(指针数组,数组指针 函数指针,函数指针数组)
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];
- 定义
实际是指针,能够指向数组的指针。
- 用途
使用在指向一个多维数组,一般用在多维数组传参。
我们知道多维数组都可以看作是一维数组,只是里面的元素也是一个数组。用二维数组举例,看做一维数组后,里面的元素是一维数组。二维数组的数组指针的指向里面那个数组的指针。
- 数组指针指向多维数组:
#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;数组指针中括号里的数值要与数组数值一样。
- 数组指针传参
#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).相当于调用了这两个函数。
以上是关于帮你捋值复杂指针(指针数组,数组指针 函数指针,函数指针数组)的主要内容,如果未能解决你的问题,请参考以下文章