7.22

对象在内存中所占存储空间的其实地址称为指向该对象的指针, 从本质上讲,指针就是地址

指针变量是指保存其他对象内存地址(指针)的变量(是“指针类型”的变量)。(一般情况下存放用户自定义的变量的地址,或者用户自己申请的内存空间的首地址)

 指针的运算

1.取地址运算——&

&是一个单目运算符,用于获取存储单元的首地址,称其为取地址运算。

2.引用目标运算符——*

*是一个单目运算符,用于对某一指针所指目标进行访问,称其为引用目标运算。(这种运算只能加在指针类型的数据上)

数组名与指针是完全相同的数据类型,它们之间的运算是通用的。区别仅在于数组名是指针常量而已。

main()
{
    int a[10],*p=a,i;
    for (i=0;i<10;i++)
        scanf("%d",p++);
    for (i=0;i<10;i++)
        printf("a[%d]=%d\n",i.a[i]);
    for (i=0;i<10;i++)
        printf("*(a+%d)=%d\n",i,*(a+i));
}

用指针的方法 实现将数组中的 元素颠倒放置

main()
{
    int a[10],i,t,*p=a,*q=a;
    printf("\n");
    for (i=0;i<10;i++)
        scanf("%d",p++);
    for(p--;q<p;p--,q++)
    {
        int temp;
        temp=*p;
        *p=*q;
        *q=temp;
    }
    printf("\n");
    for (i=0;i<10;i++)
        printf("%d",a[i]);
}

 在一维数组和二维数组中,a+i和*(a+i)的含义不同。在一维数组中a+i表示数组a的第i个元素地址,而*(a+i)为数组a中第i个元素的值;在二维数组中,a+i和*(a+i)都表示地址,其中a+i表示数组a的第i行首地址,而*(a+i)表示a数组中第i行第0列元素的地址。

用数组元素偏移量访问数组

main()
{
    int a[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
    int i,j;
    for (i=0;i<3;i++)
    {
        for (j+0;j<4;j++)
            printf("a[%d][%d]=%-5d",i,j,*(a[0]+i*4+j));
    }
}
/*表达式a[0]+i*4+j表示第i行第j列元素的地址,因此*(a[0]+i*4+j)就是元素a[i][j]*/

*(a[0]+i*4+j)不能写成*(a+i*4+j),因为a所指对象是行,a+i*4+j表示从a开始跳过i*4+j行所得到的地址;而a[0](即*(a+0))所指的对象为元素,所以a[0]+i*4+j表示从a[0]开始跳过i*4+j个元素所得到的地址(即a[i][j]的地址)

与指针有关的常见说明和意义
指针意义
int *p;p为指向整型量的指针变量
int *p[n];p为指针数组,由n个指向整型量的指针元素组成
int (*p)[n];p为指向整型一维数组的指针变量,一维数组的大小为n
int *p();p为返回指针值的函数,该指针指向整型量
int (*p)();p为指向函数的指针,该函数返回整型量
int **p;p为一个指向另一指针的指针变量,该指针指向一个整型量

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值