13 数组指针和指针数组区别判断
1.&数组名 vs 数组名
#include <iostream>
using namespace std;
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int (*pp)[10] = &arr;//数组指针(数组的指针),pp+1的跨度为sizeof(int)*10
cout << "----------------------" << endl;
printf("arr的地址是%p\n", arr);
printf("arr+1的地址是%p\n", arr + 1);
printf("p的指向是%p\n", p);
printf("p+1的指向是%p\n", p + 1);
cout << "----------------------" << endl;
printf("&arr的地址是%p\n", &arr);
printf("&arr+1的地址是%p\n", &arr + 1);
printf("pp的指向是%p\n", pp);
printf("pp+1的指向是%p\n", pp + 1);
cout << "----------------------" << endl;
printf("&arr[0]的地址是%p\n", &arr[0]);
printf("&arr[0]+1的地址是%p\n", &arr[0] + 1);
printf("pp[0]的指向是%p\n", pp[0]);
printf("pp[0]+1的指向是%p\n", pp[0] + 1);
cout << "----------------------" << endl;
return 0;
}

实际上:&arr表示的是整个数组的地址,arr表示的是该数组首元素的地址。
虽然二者的值相等,但是在arr+1与&arr+1上显示出的值是不一样的。arr+1与arr表示出的值相差4字节,即一个整型空间;&arr+1与&arr表示出的值相差40个字节,即10个整型空间;所以arr+1跳过的是该数组的一个整型元素,而&arr+1跳过的是整个数组的10个元素。

2.指针数组
指针数组即是存放指针的数组,本质上是数组,该数组存放的元素是指针。
int arr[]是存放整型的数组;char arr[]是存放字符的数组;float arr[]是存放浮点型的数组;所以arr[]前的类型声明了该数组的类型,所以int* arr[]表示是存放整型指针的数组;char* arr[]是存放字符型指针的数组。
3.数组指针
数组指针本质是指针,如int* p表示的是指向整型数据的指针;float* p表示的是指向浮点型数据的指针,所以数组指针是指向数组的指针。
数组指针的的书写:int (*p)[10],p和*先结合说明p是一个指针变量,然后指向的是一个大小为10的整型数组,所以叫数组指针。注意书写是()不可遗漏,[]的优先级大于*,必须保证*和p先结合。
//打印二维数组
#include <stdio.h>
void print(int (*p)[5], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("%d ", *(*(p + i) + j));
//p+i指向的是第i行的地址
// *(p+i)是取到了第i行的地址,
// *(p+i)+j是指向第i行第j列的地址
// *(*(p+i)+j)取出的是第i行第j列的元素
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
print(arr, 3, 5);
//数组名arr,表示首元素的地址。
//对于二维数组的首元素是第一行。
//所以传递的是第 一行的地址,即一维数组的地址。
//可以用数组指针接受
return 0;
}

浙公网安备 33010602011771号