指针数组与数组指针
数组指针-->顾名思义就是一个指针
指针数组-->顾名思义就是一个数组
首先我们来看看优先级 () > [] > *
数组指针
- 首先,我们先定义一个数组int a[3] = {1,2,3}; 数组a的类型就是int [3]
- 我们举个例子–>我们在定义普通变量类型时写成int a那么a的类型就是int 指针就写成int*
- 数组指针是存放数组的地址即
int a[3] = {1,2,3};
int (*p)[3] = &a - 相同点与不同点
相同点:p和a的地址相同,因为a是首地址,p是这个数组的地址也是指向a[0]处;
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(int arg, char* argc[])
{
int a[3] = { 1,2,3 };
int(*pArr)[3] = &a;
printf("%p\n", a);
printf("%p\n", pArr);
return 0;
}
运行结果:
不同点:p+1是跳动一个数组的长度,a+1是跳动一个int型的长度
我们画图分析:
代码实现查看
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(int arg, char* argc[])
{
int a[3] = { 1,2,3 };
int(*pArr)[3] = &a;
printf("%p\n", a + 1);
printf("%p\n", pArr + 1);
return 0;
}
运行结果
数组指针的应用:
通常我们用于二维数组
例如
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(int arg, char* argc[])
{
int arr[][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int(*p)[4] = &arr;//相当于每行数组的地址
int i = 0;
for ( i = 0; i < 3; i++)
{
int j = 0;
for ( j = 0; j < 4; j++)
{
printf("%d ", *(*(p + i) + j));//*(p+i)相当于p[i]
}
printf("\n");
}
return 0;
}
运行结果
通过数组指针,我们很好的访问了一个二维数组
指针数组
形如int* parr[5];这个就是指针数组,parr先和[]匹配再和int* 匹配,所以它是一个数组,而且是一个指针数组。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Add(int* arr[],int sz)
{
int sum = 0;
int i = 0;
for ( i = 0; i < sz; i++)
{
sum += *(*(arr+i));
}
return sum;
}
int main(int arg, char* argc[])
{
int a = 10;
int b = 20;
int c = 30;
printf("a = %d, b = %d, c = %d\n", a, b, c);
int* p[3] = { &a,&b,&c };
int ret = Add(p, 3);
printf("a + b + c = %d\n", ret);
return 0;
}
运行结果
我们在写一个Add函数时,不用传三个变量进来,直接传一个数组指针和长度即可。