C语言指针操作总结

总结了C语言中指针的相关操作,为便于理解,建议逐句比较,有问题也麻烦帮忙指正。 

#include<stdio.h>
int main(){
    int i,j,s[3]={1,2,3};
    ///1、用指针访问一维数组
    int *p=s;           ///p是一个指向元素类型为整数的数组的指针
    for(i=0;i<3;i++){
        ///printf("%d %x\n",s[i],&s[i]);///输出数组每个元素的内容以及每个元素所在的位置
        ///printf("%d %x\n",*(s+i),s+i);
        ///printf("%d %x\n",p[i],&p[i]);
        ///printf("%d %x\n",*(p+i),p+i);
        ///printf("%d %x\n",*p,p);p++;
    }
    ///2、用定长指针访问一维数组
    int (*pp)[3]=s; ///pp是一个指针,指向一个含有3个整数元素的数组
                    ///pp的每个元素都占用3个int的空间,即3*4=12byte
                    ///初始地址被设置为数组s的首地址,
                    ///假设s初始地址为0x0000,pp[0]指向0x000c,pp[1]指向0x0018
    ///查看地址占用情况
    for(i=0;i<4;i++){
        ///printf("%x\n",pp[i]);
    }
    for(i=0;i<3;i++){
        ///printf("%d %x\n",pp[0][i],&pp[0][i]);///仅有三个元素,只能从pp[0]开始
                                                ///pp[1]就会跳过数组存放的地理位置
    }
    int s1[3][3]={1,2,3,4,5,6,7,8,9};///s1[][3];一维可以省略,但是二维不可以,一维省略了,
                                     ///编译器可以用总数除以二维的长度,确定一维。如果,
                                     ///二维省略了,编译器无法知道如何去分配,导致发生错误。
    ///3、用一维指针访问二维数组
    int *p2=s1;
    for(i=0;i<9;i++){
        ///printf("%d %x\n",*p2,p2);p2++;///二维数组在内存中也是顺序存放,位置相邻
        ///printf("%d %x\n",p2[i],&p2[i]);
        ///printf("%d %x\n",*(p2+i),p2+i);
        ///printf("%d %x\n",*p2,p2++);///!!!程序会首先执行p2++,之后在进行输出,与上面的输出结果不同
    }
    ///4、用定长指针访问二维数组
    int (*p1)[3]=s1;
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            ///printf("%d %x\n",s1[i][j],&s1[i][j]);
            ///printf("%d %x\n",*(*(s1+i)+j),(*(s1+i)+j));
            ///printf("%d %x\n",p1[i][j],&p1[i][j]);
            ///printf("%d %x\n",*(p1[i]+j),(p1[i]+j));
            ///printf("%d %x\n",*(*(p1+i)+j),(*(p1+i)+j));
        }
    }
    ///5、指针数组
    int *b[2];///数组b含有2个元素每个元素,每个元素都是指向int类型的指针
    b[0]=s;     ///第一个指针元素指向一维数组s
    b[1]=s1;    ///第二个元素指向二维数组s1
    for(i=0;i<3;i++){
        ///printf("%d %x\n",b[0][i],&b[0][i]);  ///借助指针数组元素访问s
    }
    for(i=0;i<9;i++){
        ///printf("%d %x\n",b[1][i],&b[1][i]);  ///借助指针数组元素访问s1
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值