首页 新闻 会员 周边

初学c语言指针疑问

0
悬赏园豆:10 [已关闭问题] 关闭于 2016-08-16 12:15
void main()
{
    int num = 1;
    int *p1 = num,*p2 = &num

    printf("%d\n",p1);
    printf("%d\n",*p2);
}

 



这段代码都打印的都是1,意义肯定不一样,一个是指针一个int型数据,如何透彻的理解。
c c++
睡着的糖葫芦的主页 睡着的糖葫芦 | 初学一级 | 园豆:16
提问于:2016-08-15 17:31
< >
分享
所有回答(4)
-1

你都*p2了。知道*p2什么意思不。。。

吴瑞祥 | 园豆:29449 (高人七级) | 2016-08-15 18:40

取p2地址的值。但是上一行printf("%d\n",p1);感觉理解不够透彻。

支持(0) 反对(0) 睡着的糖葫芦 | 园豆:16 (初学一级) | 2016-08-16 08:56
-1

搞清楚 * 和 & 。

& : 取地址

* :取地址中的值

| 园豆:780 (小虾三级) | 2016-08-15 21:03

这个我清楚,那printf("%d\n",p1); 打印出来的结果是1怎么理解。

支持(0) 反对(0) 睡着的糖葫芦 | 园豆:16 (初学一级) | 2016-08-16 08:59
0

 注意,int* a = &b;int* 是一个符号,叫做申明 一个int类型的指针。

double * 表示申明一个double类型的指针。

  而且它的值只能是指针类型,你怎么能把num值类型赋值给他。至少应该强制类型转换(int *)。

 & 表示取地址符,表示取一个数的地址,而* 表示取一个地址的数。

他们两个和 int & ,int * 是没有关系的。

打印地址要使用 “\p”.

小精灵儿Pawn | 园豆:470 (菜鸟二级) | 2016-08-15 23:20

这段代码是完全没有问题的,编译执行最后得出来的结果都是1,看来你对指针的理解也不怎么样。

支持(0) 反对(0) 睡着的糖葫芦 | 园豆:16 (初学一级) | 2016-08-16 08:57

@睡着的糖葫芦: 笑死我了. int * = num; 这样的代码还敢说没问题。

把一个int 类型 赋值给一个指针类型,你老师这么教你的?

支持(2) 反对(1) 小精灵儿Pawn | 园豆:470 (菜鸟二级) | 2016-08-16 10:01

@胖乎乎的小奶油: 提问的代码都没看清楚,你眼神真心不行。*p1,*p2被你吃了。看来你的水平并不能解答我的疑惑,装逼也要有点水平啊,你就自己编译运行就知道代码有没有问题了,你就知道是不是打自己脸。

支持(0) 反对(0) 睡着的糖葫芦 | 园豆:16 (初学一级) | 2016-08-16 11:31

@睡着的糖葫芦:  在你还没上高中的时候,我就已经用C语言做开发了。

支持(0) 反对(0) 小精灵儿Pawn | 园豆:470 (菜鸟二级) | 2016-08-16 11:44

@胖乎乎的小奶油: 不管你怎么说,我这边是完全没问题的,64位系统,编译器gcc,打印出来的就是2个1,你怎么解释,说了半天你就是不自己试试。

支持(0) 反对(0) 睡着的糖葫芦 | 园豆:16 (初学一级) | 2016-08-16 11:47

@睡着的糖葫芦: 第一个1 是0x0000 0001

支持(0) 反对(0) 小精灵儿Pawn | 园豆:470 (菜鸟二级) | 2016-08-16 11:53

@胖乎乎的小奶油: 那真不清楚怎么回事了

支持(0) 反对(0) 睡着的糖葫芦 | 园豆:16 (初学一级) | 2016-08-16 12:11
0

指针本质上是内存的寻址编号,即所谓的内存地址。32位系统可寻址是4个字节,64位是8个字节,你可以理解为指针就是一个int类型的数。

*p1=1,意思是指针p1为内存中地址为1,你打印p1当然就是1了,当然你打印*p1可能会报错,该内存一般被系统保护,而且一般内存的起始地址不会是1

*p2=&num,意思是p2的值是num的地址,num的地址是自动分配的,你打印*p2当然就是num的值了

皓月空 | 园豆:723 (小虾三级) | 2016-08-26 16:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册