前言
回顾上一章字符指针可以发现不同指针间的区别
int *p=NULL; p 是整型指针 - 指向整型的指针 - 可以存放整型的地址
char *pc=NULL; pc是字符指针 - 指向字符的指针 - 可以存放字符的地址
数组指针 – 指针
数组指针 - 指向数组的指针 - 存放数组的地址
数组指针的组成
char* arr[5];
char* (*pa)[5] = &arr;
// char *:pa指向的数组的元素类型是char
// pa : 指针变量的名字
// * : 说明pa是指针
// [5] : pa指向的数组是5个元素的
看代码可能好理解一点
代码1
#include<stdio.h>
int main()
{
int a = 10;
int* pi = &a;//整型的地址存放在整型指针中
char ch = 'w';
char* pc = &ch;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int(*p)[10] = &arr;//取出数组的地址
//上面的p就是数组指针
return 0;
}
*int(p)[10] = &arr;取出数组的地址
上面的p就是数组指针
让我们再来看看下面这组代码
代码2
int main()
{
int arr[10]={0};
arr;
&arr[0];
&arr;
int(*p)[10] = &arr;
printf("%p\n", arr);//int*
printf("%p\n", &arr[0]);//int*
printf("%p\n", &arr);//数组的地址 int(*)[10]
printf("%p\n", arr + 1);
printf("%p\n", &arr[0] + 1);
printf("%p\n", &arr + 1);
return 0;
}
看看这些arr
arr;-----------//首元素地址
&arr[0];------// 首元素的地址
&arr;---------// 数组的地址
结果还是意料之中的
代码3
int main()
{
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));
return 0;
}
算出结果了吗?你觉得结果是多少呢? 10? 还是4? no,no,no,都不是,答案是40;
你是不是想说我前面写着arr表示首元素地址……,确实是这样,没错,这里就是我要给大家讲的例外情况:
数组名是首元素地址
但有两个例外
1.sizeof(数组名),这里的数组名是表示整个数组的,sizeof计算的是整个数组的大小。单位为字节
2.&数组名,这里的数组名不是首元素地址,数组名表示整个数组,所以取出的是整个数组的地址
所以,大家懂了吧,这两条请务必牢记!!!
数组指针的用法
print1(arr,sz)
void print1(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
这大伙应该都没啥问题。
print2(arr,sz)
void print2(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",*(arr+i));
}
printf("\n");
}
这两个等价arr[i] == *(arr+i)
print3(&arr,sz) (错误示范)
void print3(int(*parr)[10], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", parr[i]);
}
printf("\n");
}
parr[i] == *(parr+i)
这里打印的不是元素,而是地址,与我们的目标不符合;让我们看看下面正确的解法吧!
print4(&arr,sz)
void print4(int(*parr)[10], int sz)
{
//*(parr+0);//parr[0]
int i = 0;
for (i = 0; i < sz; i++)
{
//printf("%d ", parr[0][i]);
//printf("%d ", *((parr + 0))[i]);
printf("%d ", (*parr)[i]);
}
printf("\n");
}
(*parr) 相当于parr指向数组的数组名
这里打印的就是数组里面的元素了。
main
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
print1(arr, sz);
print2(arr, sz);
//print3(&arr, sz);
print4(&arr, sz);
return 0;
}
打印结果
如下,意料之中:
参数是指针的形式
void print1(int a[3][5],int x,int y);
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");
}
}
void print2(int(*p)[5], int x, int y);
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("%d ", *(p[i] + j));
printf("%d ", *(*(p + i) + j));
printf("%d ", (*(p + i))[j]);
}
printf("\n");
}
}
上面四种写法等价
p [ i ] [ j ] == * ( p [ i ] + j ) == * ( * ( p + i ) + j ) == ( * ( p + i )) [ j ]
main
int mian()
{
int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} }; //1 2 3 4 5 int[5]
//2 3 4 5 6
print1(arr, 3, 5); //arr - 数组名 - 数组名就是首元素地址 //3 4 5 6 7
//把arr想象成一维数组
print2(arr, 3, 5);
return 0;
}
预告
下一章给大家带来指针数组!
创作不易,留给三连给博主点动力吧!