指针和数组1

今天在敲程序时候,遇到了一些小问题,于是决定利用博客来记录下来,这也是我写的第一篇CSDN的博客,希望以后能坚持下去,记录自己的学习和生活中的点滴。

指针和多级指针

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i = 1000;
    int *p = &i;//p中的内容是i的地址
    int **q = &p;//q中的内容是p的地址
    int ***r = &q;//r中的内容是q的地址
    printf("%d\n",***r);//输出的结果是10;
    return 0;
}

要点:
1.q是int 类型,p是 int 类型,r则是int * *类型;
2.指针和多级指针的关系
3. * * * r = * * q = * p = i,* p表示以p的内容为地址的变量,由图片我们可以看出,p中存放的是 int 变量i的地址,所以* p就等价于i,同理* q和** r的的含义是一样的

指针和一维数组

#include <stdio.h>
#include <stdlib.h>
int main()
{   
    int a[3] = {1,2,3};//a是a[3]的首地址 == &a[0];
    int i;
    int *p = a;//等价于int *p = &a[0];
    //*p = a[0]的含义是将a[0]的值赋给 *pfor(i = 0;i < 3;i++)
        printf("%d",a[i]);//等价于printf("%d",*(p+i));
        return 0;
}

要点:
1.a是数组的首地址,等同于&a[0];
2.printf(“%d”,a[i]);等价于printf(“%d”,* (p+i));因为数组是连续的 ,* (p+i)即指针p指向数组的第几个元素

指针和二维数组

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a1[3];
    int a2[3];
    int a3[3];
    int * p;
    int p1[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    //p1指向int [3]的指针,此处的int [3]是指二维数组中每一行的元素
    //p1和a1是相同类型的,属于int *类型 注*:a1是指数组首地址
    int * p2[3] = {a1,a2,a3};
    //p2是一个指向 int * 的指针,即ptr2的类型和&ptr是一样的,属于int **类型    
}

要点:
1.二维数组在计算机中其实是特殊的一维数组
这里写图片描述
即a[0]这行上有1,3,5,7这四个元素;
2.* ((p+i)+j)等价于p[i] [j], (p+i)代表第i行元素,* (p+i)+j则是指这行元素上的第j个元素, 然后通过 * 运算符* (*(p+i)+j)数组p[][j]中的第i行j列元素,结合上图理解二维数组是特殊的一维数组即可;

总结及参考资料

1.理解指针和数组要从内存上着手
2.二维数组的地方比较绕,要好好理解
二维数组和指向指针的指针
C/C++中二维数组和指针关系的分析
二维数组的简介和使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值