理解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=&aa的地址赋给指针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)。