1.若有定义int i = 2,a[10],*p = &a[i]; 则与 *p++等价的是 A

A、a[i++]   B、a[i]++   C、a[i]   D、a[++i]

后置++:首先要知道后置++的含义:先赋值再自加1。而*p++(*p)++的相同点是都需要进行一个后置++,不同的地方是运算符的优先顺序

指针运算符*与自增运算符++都属于单目运算符,单目运算符的优先级仅次于括号运算符()[]和成员运算符.->,而当*++同时出现在一个表达式中时,从右往左运算。

以下程序给出了*p++*++p(*p)++*(p+1)*p+1a[i++]a[++i]的结果和地址输出

#include <stdio.h>
void printfArr(int *);
int main(int argc, const char *argv[])
{
    int a[4] = {0,2,1,3};
    int *p = a;
    int i = 0,j = 0;
    printf("首地址:%p\n",p);
    printf("  地址:%p\n",p+1);
    printf("  地址:%p\n",p+2);
    printf("  地址:%p\n",p+3);
    printfArr(a);
    puts("*p++:");
    for(i=0;i<4;i++)
    {
        printf("              %p\n",p);//此处p的地址与下行p的地址不一致
        printf("内容:%d 地址:%p\n",*p++,p);//涉及printf中参数的运算顺序
    }
    printf("------------------------------------------------------\n");

    printfArr(a);
    puts("*++p:");
    p = a;
    for(i=0;i<4;i++)
    {
        printf("              %p\n",p);
        printf("内容:%d 地址:%p\n",*++p,p);
    }//数组越界,但比较幸运紧跟着的空间中数据不为空,否则造成段错误
    printf("------------------------------------------------------\n");

    printfArr(a);
    puts("(*p)++:");
    p = a;
    for(i=0;i<4;i++)
    {
        printf("内容:%d 地址:%p\n",(*p)++,p);
    }
    printf("------------------------------------------------------\n");

    printfArr(a);
    puts("*(p+1):");
    p = a;
    printf("内容:%d 地址:%p\n",*(p+1),p);
    printf("------------------------------------------------------\n");

    printfArr(a);
    puts("*p+1:");
    p = a;
    printf("内容:%d 地址:%p\n",*p+1,p);
    printf("------------------------------------------------------\n");

    printfArr(a);
    puts("a[i++]:");
    p = a;
    i = 0;
    for(j=0;j<4;j++)
    {
        printf("地址:%p 内容:%d\n",&a[i],a[i++]);//printf函数在linux中从右向左运算
        //printf("内容:%d 地址:%p\n",a[i++],&a[i]);
    }//数组越界,但比较幸运紧跟着的空间中数据不为空,否则造成段错误
    printf("------------------------------------------------------\n");

    printfArr(a);
    puts("a[++i]:");
    p = a;
    i = 0;
    for(j=0;j<4;j++)
    {
        printf("地址:%p 内容:%d\n",&a[i],a[++i]);
    }
    printf("------------------------------------------------------\n");
    return 0;
}
void printfArr(int *a)
{
    int *p = a;
    int i = 0;
    printf("{");
    for(i=0;i<4;i++)
    {
        printf(" %d ",p[i]);
    }
    puts("}");
}

printf函数中参数运算顺序

结果

总结

*p++:*与++优先级相同,从右向左运算。先进行后置++运算,p先赋值,那么表达式即为*p返回p中地址指向的空间内存储的数据,再进行表达式p=p+1的运算即p向右偏移1位。

*++p:*与++优先级相同,从右向左运算。先进行前置++运算,即p表达式p=p+1,向右偏移1位,再对p截引用得到此时p中地址指向的空间内存储的数据。

(*p)++:圆括号优先级最大,*p先运算降级间接访问p中地址指向空间内存储的数据,对这个数据再进行后置++,先赋值在自加1,期间p的值不变。

*(p+1):截引用p+1中地址指向空间内存储的数据。

*p+1:截引用p中地址指向空间内存储的数据,返回这个数据加1。

a[i++]:先赋值再向右移1位,结果与*p++一致。

a[++i]:先向右移1位再进行赋值,结果与*++p一致。

Last modification:2021 年 03 月 26 日 22 : 34 : 02