一、数组指针
数组指针,即是指向数组的指针,数组指针中存放的应该是数组的地址。
1. 数组名的区分
数组名:数组名就是数组的最大存储单元的首地址,指向第一个元素,所以数组名的类型为元素类型的指针
&数组名[0]:第一个元素的首地址,和数组名的值,以及含义都一模一样
&数组名:整个数组的首地址,指向的是整个数组,与上面两者值一样,但是含义却不一样
2. 一维数组指针的使用
数组指针的定义是例如:int(*p)[3]=NULL;
int main()
{
int(*p)[4] = NULL;//数组指针定义
int arr[4] = { 1, 2, 3, 4 };
p = &arr;//类型为int(*)[]
printf("%d %d %d %d\n", p, p + 1, p + 2, p + 3);//跳过整个数组
printf("%d %d %d %d\n", &arr, &arr + 1, &arr + 2, &arr + 3);//每个元素地址
printf("%d %d %d %d\n",arr,arr+1,arr+2,arr+3);//每个元素地址
printf("%d %d %d %d\n", *p, *p + 1, *p + 2, *p + 3); //每个元素地址
printf("%d %d %d %d\n", *arr, *(arr + 1),*( arr + 2), *(arr + 3));//对每个元素地址进行解引用,即取出该地址中的数据
printf("%d %d %d %d\n",*(*p),*(*p+1),*(*p+2),*(*p+3));//对每个元素地址进行解引用,即取出该地址中的数据
return 0;
}
3. 二维数组指针的应用
二维数组指针与一维数组指针的应用有些差别,因为二维数组的每个元素都是一维数组,所以最大的存储单元应该是一个指向一维数组的指针。所以不用对二维数组取地址。
//二维数组的每个元素都是一维数组,所以最大的存储单元应该是一个指向一维数组的指针
int(*pp)[4] = NULL;
int str[2][4] = { 1, 2, 3, 4 ,5,6,7,8};
pp = str;//类型为int* 注意不能取地址
printf("%d %d\n",pp,pp+1);//跳过一个一维数组的长度
printf("%d %d\n", str, str + 1);//跳过一个一维数组的长度
printf("%d %d %d %d\n", *pp, *(pp + 1));//取第一行,第二行的第一个地址
printf("%d %d %d %d\n", **pp, *(*pp + 1), *(*pp + 2), *(*pp + 3));//第一行的每个元素
printf("%d %d %d %d\n", **(pp+1), *(*(pp + 1) + 1), *(*(pp + 1) + 2), *(*(pp + 1) + 3));//第二行的元素输出
二、指针数组
指针数组是每个元素都是指针的数组。存储类型为int*这样的指针;
//指针数组
int main()
{
int* p[2] = { NULL };//指针数组中每一个都是指针,
//方法1
int* a = NULL;
int b = 6;
a = &b;
p[0] = a;
printf("%d\n",*p);
printf("%d\n",a);
//方法2用动态内存分配
for (int i = 0; i < 2; i++)
{
p[i] = (int*)calloc(1,sizeof(int));//开辟4个字节空间
if (p[i] == NULL)//判断是否成功
{
printf("开辟空间失败 %d",i);
return -1;
}
*p[i] = i;//赋值
}
for (int i = 0; i < 2; i++)
{
printf("%d ",*p[i]);
}
while (1);
return 0;
}
三、数组指针与指针数组的区别
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定(如自己动态开辟空间),每一个元素都是一个指针。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。至于它指向的数组占多少字节,不知道,具体要看数组大小。它是“指向数组的指针”的简称。