理解C语言中的指针(一)
来源:互联网 发布:数据挖掘入门书籍推荐 编辑:程序博客网 时间:2024/06/05 07:12
问题:(*p)++、*p++、 *(p++)、p++的含义。
1) 先理解p与*p的区别:
#include<stdio.h>
int main(void)
{
int *p;
int a = 4;
p = &a;
printf("%d/n", p);
printf("%d/n", *p);
}
分析:C语言中,指针指向的是地址(或内存空间)。在本程序中,在主函数中的第一行定义了一个指针,接下来利用句子p=&a把a的地址赋给指针p,这样p就指向a在内存中的地址。注意,定义是写成int *p, 然后在接下来的使用中,p表示指针,*p不是表示指针,而是表示p所指的内存地址中的值。也就说,除了刚定义时用到*p,之后再出现的*p指的是指针所指的内存地址中所存放的值。
运行结果为:
1245048
4
2) 理解p++和++p
p++表示先使用p的值,再让p=p+1; ++p表示先使p=p+1,再使用p的值。这样,我们可以推断,p++之后输出的值跟p的值是一样的,若再次输出p, 可以看到p的值变大。验证如下:
#include<stdio.h>
int main(void)
{
int *p;
int a = 4;
p = &a;
printf("%d/n", p);
printf("%d/n", *p);
printf("%d/n", p++);
printf("%d/n", p);
}
运行结果为:
1245048
4
1245048
1245052
从输出结果可以看到, printf("%d/n", p++);输出的地址仍旧为1245048,因为是先使用p的值,再使p自加一次,所以再次输出p时,p的值才变为1245052。然而这里有一个问题,为什么输出的不是1245049,而是1245052呢,这是因为p是一个整型指针,每个整型变量所占的内存为4个字节,所以p自加一次增加的值是4而不是1.
下面以字符型指针为例:
#include<stdio.h>
int main(void)
{
char *p;
char a = 'a';
p = &a;
printf("%d/n", p);
printf("%d/n", *p);
printf("%d/n", p++);
printf("%d/n", p);
}
运行结果:
1245048
97
1245048
1245049
最后输出的结果是1245049,原因就是这里的p是一个字符型指针,每个字符所占的内存为一个字节,所以自加后的值比原来的值大1.
再看一下++p的情况:
#include<stdio.h>
int main(void)
{
int *p;
int a = 4;
p = &a;
printf("%d/n", p);
printf("%d/n", *p);
printf("%d/n", ++p);
printf("%d/n", p);
}
运行结果:
1245048
4
1245052
1245052
从运行结果可以看出,最后两句printf("%d/n", ++p); 和printf("%d/n", p);输出的都是1245052,其原因就是++p是先使p自加,然后再取p的值。
3) 理解(*p)++
在所有的运算符中,()的优先级最高,所以(*p)是一个值,其值就是4,然后再自加。注意这里是先取(*p)的值,取完之后再自加,请看下面的程序:
#include<stdio.h>
int main(void)
{
int *p;
int a = 4;
p = &a;
printf("%d/n", p);
printf("%d/n", *p);
printf("%d/n", (*p)++);
printf("%d/n", (*p));
}
运行结果为:
1245048
4
4
5
4)理解*p++
在C语言里,运算符++的优先级比运算符*的优先级要高,所以*p++等价于*(p++),因为p++是先使用p的值再使p自加,所以*(p++)的值仍然为4. 请看下面的程序:
#include<stdio.h>
int main(void)
{
int *p;
int a = 4;
p = &a;
printf("%d/n", p);
printf("%d/n", *p);
printf("%d/n", *p++);
}
运行结果:
1245048
4
4
5)理解*(p++)
由4)的分析可知,*(p++)的输出结果必为4,编个程序验证如下:
#include<stdio.h>
int main(void)
{
int *p;
int a = 4;
p = &a;
printf("%d/n", p);
printf("%d/n", *p);
printf("%d/n", *(p++));
}
运行结果:
1245048
4
4
6)综上所述,(*p)++表示先取p所指向的内存地址中的值,然后使这个值自加1;*p++表示取*p的值之后,再使p指向的内存地址自加(不一定是自加1,若p是整型指针则加4,若p是字符型指针,则加1);*(p++)表示的意思与*p++完全相同;p++表示先取p所指的地址,再使p指向的内存地址自加不一定是自加1,若p是整型指针则加4,若p是字符型指针,则加1)。
- 理解C语言中的指针(一)
- 深入理解C语言指针(一)
- C语言指针理解(一)
- C语言中的指针理解
- C语言中的指针(一)
- 在c语言学习中的问题(一):数组指针,指针数组,二维数组的理解与区分
- 【C语言学习】指针再理解(一)
- c语言之指针理解一
- c语言之指针数组理解一
- c语言之多级指针理解一
- C语言中的指针-记录个人理解
- C语言中的指针初步理解
- 理解C指针:(一)指针初探
- C语言中的指针数组与数组指针的理解
- C语言指针(一)
- C语言------指针(一)
- C语言指针(一)
- C语言指针(一)
- 2010-1-9
- 必须知道的社会生活十二大著名法则
- tikiwiki 安装数据库默认latin1编码,中文在phpmyadmin乱码
- 自动化测试知识体系(ABOK)
- 初学者学习C++的50条忠告
- 理解C语言中的指针(一)
- 姗姗迟来的2009年年终总结
- 传智播客--JBPM流程图详解总结
- C++ 初学者指南 第二篇(10)
- CE6内核启动过程-新角度
- Review C[To Be continue]
- 输出有向图的环路(山债版)
- 当Widget遇上MID
- vim补全(转载,谢谢原作者)