yu457001 发表于 2014-1-23 12:22:14

关于指针和指针变量

//指针指向的值的输出和指针变量的赋值
#include<stdio.h>
int main()
{
      int *p_a,*p_b;
      int a,b;
      a=1;
      b=0;
      p_a=&a;
      printf("1---p_a=%d\n",p_a);//p_a指向a的地址所以p_a输出的是a的地址p_a=1245044
      printf("2---a=%d\n",a);//a输出a的值                              a=1
      printf("----p_a=%d\n",*p_a);//通过*对a的地址取值,所以p_a输出的是a的值 p_a=1

      *p_a=2;
      printf("3---a=%d\n",a);//通过指针变量给变量赋值a的值发生了改变   a=2
      printf("4---p_a=%d\n",p_a);//指针指向的a的地址没有改变             p_a=1245044

      p_b=&b;
      printf("5---*p_b=%d\n",*p_b);//通过*对b的地址取值,所以p_b输出的是b的值 *p_b==0
      printf("p_b=%d\n",p_b); //输出时没有使用*取值,所以p_b输出的是b的地址   b=1245040
      printf("b=%d\n",b);//b输出b的值                                        b=0

      *p_b=b;

      printf("6---p_b=%d\n",p_b);//p_b输出的是b的地址                     p_b=1245040   
      *p_b=3;
      printf("7---p_b=%d\n",p_b);//p_b输出的是b的地址                      p_b=1245040
      printf("8---b=%d\n",b);   //通过指针变量给变量赋值 b的值发生了改变   b=3


      p_b=b; //没有指针变量没有*,或者=号后面的变量没有& 编译器会给出错误警告
      printf("9---p_b=%d\n",p_b);//p_b输出 3                              p_b=3
      printf("10---b=%d\n",b);   //输出b的值                              b=3
}

/*通过上面的各种组合和对应的结果看出
1) p_a=&a;
输出时 p_a 指向的是a的地址,a不受被指向的影响,输出本身的值。
*p_a 输出a的值,充分说明*用在输出参数前面时是用来取值的

2)*p_a=2;
输出时 a=2,这是因为*p_a通过指向给a赋了新值了。所以a从1变成了2;
p_a在这里依旧是指向的a的地址

3) p_b=&b;
输出时 p_b 指向b的地址,就输出b的地址

4)p_b=b;
这样的书写格式是会收到编译器警告的,但是貌似还是可以有输出,
不知道这样的强行输出会不会对输出结果有影响
p_b 输出b的值3   b也输出自己的值

虽然总结了这么多,但是我还是分不清p_a 和p_b什么时候是指针,什么时候是指针变量。知道的朋友请给讲解一下
谢谢了{:1_1:}
*/
/*
以上是我自己总结的,肯定会有疏漏和错误的地方,希望看到的朋友给予补充和指正
一起努力,有经验一起分享
*/

牡丹花下死做鬼 发表于 2014-1-23 17:00:54

这应该是 技术交流吧

yu457001 发表于 2014-1-23 19:15:58

牡丹花下死做鬼 发表于 2014-1-23 17:00 static/image/common/back.gif
这应该是 技术交流吧

:lol:我是觉得可能还有其他人会有其他建议和看法,所以放在争议这里了

fishc_hz 发表于 2014-1-23 23:12:56

貌似没什么问题吧

千里婵娟 发表于 2014-1-23 23:46:18

   楼主问的问题:p_a,p_b什么时候是指针变量,什么时候是指针,这个是什么意思。。。你程序中给的定义int *p_a,*p_b;这说明p_a,p_b是一个指向整型的指针变量,其存储的内容是指针。我用的VC++6.0,编译p_a=a,不能将一个整型变量值赋给指针型变量,这句有错误,所以没有输出。。

网络学习 发表于 2014-1-24 00:20:24

俺来学习路过

yu457001 发表于 2014-1-24 10:02:55

千里婵娟 发表于 2014-1-23 23:46 static/image/common/back.gif
楼主问的问题:p_a,p_b什么时候是指针变量,什么时候是指针,这个是什么意思。。。你程序中给的定义int...

p_b=b; //没有指针变量没有*,或者=号后面的变量没有& 编译器会给出错误警告
我这些后面都有注解的,是有警告,但是我这输出了。我们用的相同的编译器

千里婵娟 发表于 2014-1-24 19:04:11

yu457001 发表于 2014-1-24 10:02 static/image/common/back.gif
p_b=b; //没有指针变量没有*,或者=号后面的变量没有& 编译器会给出错误警告
我这些后面都有注解的,是 ...

      反正我的VC++6.0是不能运行。。改用了一下DEV C++,可以运行,p_b=b输出p_b是b的值,这句的意思可以理解为把b的值作为地址赋给p_b,p_b表示的还是地址,不知道C标准里这样是不是允许的,但我感觉最好别这样用。。因为如果这样用,那么程序员在C程序里能够随意使用内存单元,这样是很危险的。。。

鹏程完了 发表于 2014-1-25 00:19:15

来学习学习来学习学习

yu457001 发表于 2014-1-25 10:36:01

千里婵娟 发表于 2014-1-24 19:04 static/image/common/back.gif
反正我的VC++6.0是不能运行。。改用了一下DEV C++,可以运行,p_b=b输出p_b是b的值,这句的意思可以 ...

呵呵,我是才开始学,这样写只是为了看看会出什么样的错误和结果,以便加深自己的理解和印象

tk2003 发表于 2014-1-25 17:36:22

指针存储的是地址,比如:
int A;   
int *pointA=A;
指针是一个变量,它有自己的内存空间,但是不存储具体的值,而是存储它指向的变量的地址!
如果A是INT,那么&A就是A的地址,也就是放在pointA中存储的、

*是操作符,可以叫解除引用操作符,将它用于指针,就是*pointA,那么他就是代表A的值了,这时候就不是地址了!
简单总结,A是变量,pointA是指针存放A的地址,*pointA表示存储在改地址的值

601692421 发表于 2014-1-26 00:27:54

这是一个较全面的总结吧!

C习生 发表于 2014-1-26 00:31:54

感谢分享    学习了

冷暖自知 发表于 2014-2-5 23:04:29

俺来学习路过

a471893438 发表于 2014-2-6 01:09:22

c把一个变量的地址称作指针,存放指针的变量称作指针变量。所以a的地址就是a的指针。那么你用定义了p_a来存放地址,那么p_a就是指针变量。第一句翻书找的。刚学不久。

HansonCPT 发表于 2017-6-19 20:47:57

一起学习指针
页: [1]
查看完整版本: 关于指针和指针变量