← 返回首页
指针数组与数组指针
发表时间:2024-10-10 02:40:23
指针数组与数组指针

1. 指针数组 (Array of Pointers)

指针数组本质是数组,数组里面的每一个元素是指针类型。

内存分布与存储位置: - 指针数组本质:指针数组是一个存储指针的数组,这个数组的每个元素都是指针,它们分别指向不同的内存地址。这些指针的存储位置在内存的栈或全局数据段(取决于它的声明位置)。 - 每个指针指向的地址:这些指针可以指向任意的内存位置,例如堆(动态分配的内存)或栈(局部变量的地址)等。指针数组的元素只保存地址,而不直接存储指向数据。

实例:

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptarr[5];
    for (int i = 0; i < 5; i++)
    {
        ptarr[i] = &arr[i];
    }
    printf("\n-----------------------\n");
    for (int i = 0; i < 5;i++)
    {
        printf("parr[%d] addree=%d ,value=%d\n", i, ptarr[i], *ptarr[i]);
    }

    printf("ptarr size is :%d\n", sizeof(ptarr));
    return 0;
}

2.数组指针 (Pointer to an Array)

数组指针本质是指针,是指向一个数组类型的指针变量。

内存分布与存储位置: - 数组指针本质:数组指针是一个指向数组的指针,它存储的是一个数组的起始地址。这个指针的存储位置与指针数组相似,也可以位于栈或全局数据段(取决于声明的位置)。 - 数组本身:ptr 指向的数组是实际存储数据的区域。数组的存储空间通常分配在栈或堆中(如果是静态数组,通常在栈中;如果是通过动态分配,通常在堆中)。数组的内存是连续的,所有元素在内存中是紧挨着存储的。

实例:

#include <stdio.h>

int main()
{

    int arr[5] = {1, 2, 3, 4, 5};
    int(*ptarr)[5] = arr;
    printf("arr address is :%d", &arr);
    //printf("arr address is :%d", arr);
    printf("\n-----------------------\n");
    for (int i = 0; i < 5;i++)
    {
       printf("parr[%d] addree=%d ,value=%d\n", i, *ptarr, *(*(ptarr)+i));
    }
    printf("ptarr size is :%d\n", sizeof(ptarr));   //8 ,数组指针本身的大小
    printf("ptarr size is :%d\n", sizeof(*ptarr)); //20 ,指向数组所占用的内存大小
    return 0;
}

3.总结