七.数组指针
1.基本概念与形式
数组指针类型:int(*)[10]
1. int arr[10]={1,2,3,4,5}; 2. int (*pa)[10]=&arr; 取出的是数组的地址存放到pa中,pa是数组指针变量
2.区分指针数组与数组指针
- int*p1[10]:指针数组
- int(*p)[10]:数组指针
3.数组指针的使用
一.(数组传参,数组形式接收)
- 数组传参传数组名的本质:也是传首元素地址
- 【数组的地址=首元素的地址=数组的起始位置】
二.(首元素地址传参)
PS:数组名是首元素地址:只有两个例外:sizeof(数组名)/&数组名
*三.(数组指针传参)——较繁琐,在一维数组上用的比较少
八.指针在二维数组的应用
1.常规写法(数组传参,数组形式接收)
代码图示:
2.指针写法(数组传参,数组指针形式接收)
原理:
- *所以当二维数组的首元素+1时,直接跳过一行,来到下一行
- *变化以后,可以视作(一维数组)首元素的地址”+j”后,访问数组
原理图示:
代码图示:
九.小总结:区分下列表达式
1.基础部分
int*parr1[10]:指针数组类型
int(*parr2)[10]:数组指针类型
int(*parr3[10])[5]:存放数组指针的数组
PS: int (* ) [5] 是 数组指针 类型,
parr3[10] 是 数组 类型
2.拓展部分
- (*(void(*) ( ) )0 ) ( );函数类型
- void(*signal(int,void(*)(int)))(int);函数声明
- 可改写为
1. typedef void(*pf_t)(int); 2. 3. pt_f signal(int,pf_t);
十.数组参数,指针参数要点
1.一维数组传参要点
一.数组形式接收
要点:数组传参本质上传的是地址,所以不用专门创建一个数组接受——不用规定大小
代码演示:
void test1(int arr[]); void test1(int arr[10]; 均可以顺利传参 int main() { int arr[10]={0}; test1(arr); test1(arr); }
二.用指针形式接收
代码演示:
void test1(int*arr); int main() { int arr[10]={0}; test1(arr); }
2.二维数组传参要点
一.数组形式接收
要点:二维数组的列不能省略,即“列”需要规定大小
代码演示:
正确写法 void test1(int arr[3][5]); void test1(int arr[ ][5]); 错误写法: void test1(int arr[ ][ ]); void test1(int arr[3][ ]); int main() { int arr[3][5]={0}; test1(arr); }
二.用数组指针形式接收
要点:必须要用数组指针接收
代码演示:
正确写法: void test1(int(*arr)[5]); 错误写法: void test1(int*arr); int main() { int arr[10]={0}; test1(arr); }
十二.函数指针数组
函数指针数组:int(* pfArr[4] )(int,int)
1.作用与使用演示:
函数指针数组作用:可以存放多个【参数相同,返回类型相同】的函数的地址
使用演示: