指针进阶--数组指针

数组指针

是一种指向数组的指针。

int main()
{
    int arr[5]={1,2,3,4,5};
    int (*parr)[10]=&arr;//数组指针。parr中存放的是数组的地址。
    return 0;
}

照猫画虎:

int main()
{
    double* d[5];
    double* (*pd)[5];
    return 0;
}

数组名

数组名是首元素的地址,但是有两个例外。

1、sizeof(数组名)--数组名代表的是整个数组,计算的是数组大小,单位是字节。

2、&数组名--数组名表示整个数组,取出的是整个数组的地址。

int main()
{
    int arr[10]={0};
    printf("%p\n", arr);
    printf("%p\n", &arr);
    return 0;
}

上面代码,两个打印函数的结果是一样的,说明它们指向的位置是相同的,但是它们的意义却不同。 数组名arr指向的是首元素的地址,&arr指向的是数组的首地址,它们的值相同,但是类型不同。

int main()
{
    int arr[10];
    int *p1 = arr;
    int (*p2)[10] = &arr;
    
    printf("%p\n", p1);
    printf("%p\n", p1+1);
    
    printf("%p\n", p2);
    printf("%p\n", p2+1);
    return 0;
}

p1+1,增加一个整型(4个字节),但是p2+1增加的是一个数组(4*10个字节)。 所以在使用数组的地址是,我们要取出数组的首地址(&arr),而不是使用首元素地址(arr)。

数组指针的使用

在一维数组中使用

一般不在一维数组中使用。

int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    //int *p=arr;
    int (*pa)[10]=&arr;//数组指针
    for(int i=0; i<10; i++)
    {
        printf("%d" *((*pa)+i)));
    }
    return 0;
}

可以用&数组名打印数组,但是与使用数组名的方法比较很别扭。

在二维数组中使用。

不用数组指针,使用行列打印。

void print(int arr[3][5], int r, int c)
{
    for(int i=0; i<r; i++)
    {
        for(int j=0; i<c; j++)
        {
            printf("%d ", arr[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);
    return 0;
}

使用数组指针:

void print(int (*p)[5], int r, int c)
{
    for(int i=0; i<r; i++)
    {
        for(int j=0; i<c; j++)
        {
            printf("%d ", *(*(p+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;
}

int arr[5]; 整型数组。

int *parr[10];--整型指针的数组。

int (*parr2)[10];--数组指针,指向一个存放10个元素,类型为int的数组。

int (*parr3[10])[5];-- parr3是一个存放数组指针的数组,该数组能够存放十个数组指针,每个数组指针指向一个数组,数组有五个元素,类型是int。

全部评论

相关推荐

过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务