A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 四季列车 中级黑马   /  2014-9-3 10:45  /  1757 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面代码的红色区域 如果换成*p=c;程序就正确,如果换成 p = &c;,程序就错误,这是为什么啊
#include<stdio.h>
#include<stdlib.h>
char  a = 'A';
char  b = 'B';
char  c = 'C';


void changep(char *p)
{
//        *p=c;
   p = &c;
//
}
void changepp(char **p)
{

        *p = &c;        //*p  对称  char *
}


void main()
{

        char   *p = &a;
        p = &b;
        printf("我的级别是%c", *p);
        changep(p);
        printf("\n我的级别是%c", *p);
        system("pause");
}

10 个回复

倒序浏览

回帖奖励 +1

调试了下,没发现错。
回复 使用道具 举报
本帖最后由 Jr_711 于 2014-9-3 11:59 编辑

是报错还是结果不一样呢?
能把错误发出来吗?都是自学的,一起研究下
我感觉应该是打印结果不一样,是不是下面这样?
*p=c;时,打印的是
B
C
p = &c;时,打印的是
B
B

回复 使用道具 举报
本帖最后由 x65396731 于 2014-9-3 12:41 编辑

因为你这句void changep(char *p)是说要调一个char类指针进函数,函数里面写P的话不是*p,它会认为这个p的变量没有被定义过。也就是说它会认为p和*p无关。至于为什么没报错,是因为在main函数里写了这句p = &b; 这意味着你的p作为实参有传一个地址进去。
至于你想表达的这句p = &c,也就说你把p定义成了一个指针,但是你把它的定义放在了main函数里,函数里应该是不知道的吧,作用域又不对了。但这里它报错了,因为你在函数里没定义过这个p,它凭什么认为它是指针类型。
总之,你2个地方随便怎么换,都应该和你想表达的意思,也就是写这个程式的意义不一样。

点评

完全不知所云。char *p就是定义p的,怎么可能p和*p无关。  发表于 2014-9-3 16:46
回复 使用道具 举报
函数里面写P的话不是*p......................
回复 使用道具 举报
好绕。。。
回复 使用道具 举报
没看出来
回复 使用道具 举报
Jr_711 发表于 2014-9-3 11:33
是报错还是结果不一样呢?
能把错误发出来吗?都是自学的,一起研究下
我感觉应该是打印结果不一样,是不是 ...

嗯嗯,是这样的
回复 使用道具 举报
没错,至少我没发现错
1    之所以 打印结果不一样,就是 在进入 changep(p)这个函数的时候,p已经指向b呢,也就相当于*p = ‘B’
     你要是写 *p=c,相当于给p所指向的b赋值了,也就等于  ‘B’=*p = c
     如果 是p = &c的话,是直接把p的指向转换成c了,所以结果自然不一样
回复 使用道具 举报
本帖最后由 Jr_711 于 2014-9-3 20:38 编辑

1.首先,main()函数中定义了一个指针p,并给他分配了内存,
             void changep(char *p)  函数中也定义了一个指针p,同样在这个函数内部给他分配内存。
            (为避免混乱,假设main()函数定义的指针为P1,void changep(char *p) 定义的指针为P2
2.调用void changep(char *p) 函数前,P1=&b ,调用函数时,把P1的值传给P2,所以P2= &b ,即P2指向原b的地址。
3.调用void changep(char *p)  函数后,P2被回收,所以要打印的一直都是P1所指向地址的内容。



*p=c; 是把‘C’赋值到给P2指向原b的地址,即覆盖原来的值'B'。回收P2后,P1指向的地址没变,但值变成了'C'。
p = &c;是把原c的地址赋值给P2,即此时P2又改指向c原来的地址,回收P2后,P1指向的地址没变,值也没变,还是‘B’。

下面用图分析下内存,不知道你能不能看懂(虚箭头表示赋值,实箭头表示指针指向)





1.png (6.61 KB, 下载次数: 37)

*p=c;时

*p=c;时

2_副本.png (7.62 KB, 下载次数: 80)

p = &c;时

 p = &c;时
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马