指针和数组的关系

1.指针就是指向 类型的地址。
eg:
   指针和变量
   1.int * p; 就是指向整型变量的地址;
   2.char * p;指向指向字符变量的地址;
   指针和数组:
   3.char *p; p = 数组名字;
   数组指针
   4.int (*p)[5];指向int [5]类型变量的地址;
 
 

指针和变量关系test

void PoniterTest(void)//指针测试
{
    int a = 10;
    int* p = &a;
    printf("a :%d *p :%d\n", a, *p);
    *p = 100;
    printf("a :%d *p :%d\n", a, *p);

}

指针和一位数组关系test

void ArrayAndPointersTest(void)//数组和指针test
{
    int myArray[5] = { 1,2,3,4,5 };
    int* p = myArray;
    for (int j = 0; j < 5; j++)
    {
        printf("%d ", p[j]); // 等价于 myArray[i]
    }
    printf("\n");
    for (int j = 0; j < 5; j++)
    {
        printf("%d ", *(p + j)); // 等价于 myArray[i]
    }
    printf("\n");
    for (int j = 0; j < 5; j++)
    {
        printf("%d ", *(myArray + j)); // 等价于 myArray[i]
    }
    printf("\n");
    for (int j = 0; j < 5; j++)
    {
        printf("%d ", *(p++)); // 等价于 myArray[i]
    }

}

指针和二维数组关系test

void TwoArrayPoniterTest(void)//二维数组和指针测试
{
    int myArray[5][5] = { 1, 2, 3, 4, 5,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 };

    int* p = (int*)myArray;

    int(*p1)[5] = &myArray[0];

    for (int j = 0; j < 25; j++)
    {
        printf("%d ", *(p++)); // 等价于 myArray[i]
    }
    printf("\n");

    for (int j = 0; j < 5; j++)
    {
        for (int i = 0; i < 5; i++)
            printf("%d ", *((*(p1 + j)) + i)); // 等价于 myArray[i]
    }
}

二维指针和二维数组关系test

void TwoArrayAndTwoPointTest(void)//二维数组 和 二级指针
{
    int myArray[5][5] = { 1, 2, 3, 4, 5,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 };

    int myArray1[5][5] = { 1, 2, 3, 4, 5,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 };
    int* p = (int*)myArray;
    int* p2 = (int*)myArray1;
    int** p1[2] = { &p ,&p2 };
    for (int z = 0; z <= 1; z++)
    {
        for (int j = 0; j < 5; j++)
        {
            for (int i = 0; i < 5; i++)
            {
                printf("%d ", *((*p1[z] + i + j)));
            }
            printf("\n");
        }
        printf("\n");
    }

    printf("\n");

    printf("\n");
    for (int j = 0; j < 5; j++)
    {
        for (int i = 0; i < 5; i++)
        {
            printf("%d ", *((p + i + j)));
        }
    }
}

数组指针和数组关系test

void ArrayPonitrTest(void)//数组指针测试
{
    // 声明并初始化一个数组
    int myArray[5][5] = { 1, 2, 3, 4, 5,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 ,1, 2, 3, 4, 5 };
    int myArray1[5] = { 1, 2, 3, 4, 5 };
    // 声明一个指向数组的指针(指针的类型应匹配数组元素的类型)
    int(*arrayPtr)[5][5];

    // 声明一个指向数组的指针(指针的类型应匹配数组元素的类型)
    int(*arrayPtr1)[5];

    arrayPtr1 = &myArray1;
    // 将数组的地址赋给数组指针
    // 这里的myArray实际上是数组首元素的地址
    arrayPtr = &myArray;

    // 现在可以通过指针来访问数组元素
    for (int j = 0; j < 5; j++)
    {
        for (int i = 0; i < 5; i++) {
            printf("%d ", (*arrayPtr)[j][i]); // 等价于 myArray[i]
        }
        printf("\n");
    }

}

主函数

int main() {
    //TwoArrayAndTwoPointTest();
    int a = 10;
    int* p = (int*)100;


    printf("*p =%d \n", p);

    ChangePointerValue(&p);
    printf("*p =%d \n", p);

    printf("\n");

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值