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+1
、a[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("}");
}
结果
总结
*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一致。
本文链接:https://shengto.top/c/C_problem_set_1.html
转载时须注明出处及本声明