免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

对C语言指针的讨论:应当如何理解、使用指针?《狂人C:程序员入门必备》有奖试读 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2010-12-12 23:42 |只看该作者
2.  数组名有两种类型吗?

答:数组名只有一种类型,如char a[10];

其中的a,就是char数组类型,在本函 ...
notion001 发表于 2010-12-12 23:33

对于程序员来说
说数组名在作为左值和右值是分别有两种类型没有任何问题
标准的说法是存在类型转换
但这对编译器作者有意义
对程序员来说是画蛇添足的说法

论坛徽章:
0
52 [报告]
发表于 2010-12-12 23:44 |只看该作者
很简单,链表就是其中最好的一个,其地址也并不一定在一起
notion001 发表于 2010-12-12 23:23

所以也没见过对链表进行整体操作的运算
都是一个一个节点处理的
每个节点都是连续的您不否认吧

论坛徽章:
0
53 [报告]
发表于 2010-12-12 23:44 |只看该作者
指针类似于整型?
int i=1;
int *p = &i ;
i+1和p+1类似吗?显然截然不同
&i是一个指针类型的表达式, ...
KBTiller 发表于 2010-12-12 23:36



    你上面都说了

   int *p = &i ;


    那i+1和p+1显然是不一样的,但&i+1和p+1类似。不是么?
  &i不是取地址,是什么,不是把它在内存中的位置取出来么?不管它用什么量,实质就是把它在内存中的位置取出来

   指针类似于整型确实很正确,在内存中其实质就是无符号整型。但要从C语言的角度来理解其就要进行相应的转换而已

论坛徽章:
0
54 [报告]
发表于 2010-12-12 23:47 |只看该作者
回复 42# notion001

&i 不是一个有效的左值是因为其不可写。运算中的这些“中间值”,它是存储在内存中的一个不可写的特殊位置上。
一个实验可知道:
char* c;
c = "abc";
*c = "abc";

提示不是坐值恰恰说明指针是一个变量,它有自己的内存空间,它能存储一个地址信息,它有自己的地址。

另:地址永远不可更改!对指针值的更改仅仅是通过偏移来寻址。

论坛徽章:
0
55 [报告]
发表于 2010-12-12 23:49 |只看该作者
赋值给谁?
    是被赋值的指向,还是void *指向
    这就好比
    int i=3;
    double d; ...
KBTiller 发表于 2010-12-12 23:38



    前面都说了void *赋值

   请问您这哪个void *赋值?
  1. int i=3;
  2.     double d;
  3.     d = i ;
复制代码
我的意思是:
    int *p ;
      void *q;

      q=p;

    此时q不是int *类型么?

论坛徽章:
0
56 [报告]
发表于 2010-12-12 23:50 |只看该作者
但&i+1和p+1类似。不是么?
  &i不是取地址,是什么,不是把它在内存中的位置取出来么?不管它用什么量,实质就是把它在内存中的位置取出来

   指针类似于整型确实很正确,在内存中其实质就是无符号整型。但要从C语言的角度来理解其就要进行相应的转换而已notion001 发表于 2010-12-12 23:44


我倒是觉得这恰恰说明了&i是指针
你说指针类似整型,且不谈你的“整型”有没有精确清晰的定义,
要知道“数据类型”不只包括如何表示数据的内涵,还有相应的运算
什么叫“在内存中其实质就是无符号整型”(btw:它也不大可能在别的地方吧)
无符号整型的运算规则和指针一样吗

论坛徽章:
0
57 [报告]
发表于 2010-12-12 23:51 |只看该作者
指针类似于整型?
int i=1;
int *p = &i ;
i+1和p+1类似吗?显然截然不同
&i是一个指针类型的表达式, ...
KBTiller 发表于 2010-12-12 23:36

类似   和    等同
是一个词吗?

论坛徽章:
0
58 [报告]
发表于 2010-12-12 23:53 |只看该作者
回复  notion001

&i 不是一个有效的左值是因为其不可写。运算中的这些“中间值”,它是存储在内存中的一个不可写的特殊位置上
jc_zhong 发表于 2010-12-12 23:47


看来在下是有些孤陋寡闻了
敢问您说这句话的依据何在?抑或这只是您的臆测而已

论坛徽章:
0
59 [报告]
发表于 2010-12-12 23:55 |只看该作者
回复  notion001

一个实验可知道:
char* c;
c = "abc";
*c = "abc";

提示不是坐值恰恰说明指针是一个变量,它有自己的内存空间,它能存储一个地址信息,它有自己的地址。

...
jc_zhong 发表于 2010-12-12 23:47



    不是这样提示的吧
    您用的什么编译器?

论坛徽章:
0
60 [报告]
发表于 2010-12-12 23:57 |只看该作者
我的意思是:
    int *p ;
      void *q;

      q=p;

    此时q不是int *类型么?notion001 发表于 2010-12-12 23:49


很遗憾q不是int *类型,那写的很清楚,q就是void *类型
p倒是int *类型无疑
可是*p和*q是一样的含义吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP