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;
}

image

实际上:&arr表示的是整个数组的地址,arr表示的是该数组首元素的地址

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

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;
}
posted @ 2022-06-10 17:33  豪崽_ZH  阅读(57)  评论(0)    收藏  举报