LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 822|回复: 8

问2个C指针的问题

[复制链接]
发表于 2009-3-24 23:18:21 | 显示全部楼层 |阅读模式
问几个C指针的问题

各位,我近来在看一些代码,并尝试做些修改,但有几个问题不太明白,
看这里人多,就贴上来,想请教一下:

1)片段1:
char upper(char *packages, int len)
{
char *table=NULL;
...........
parse(packages, table);
..............
}

void parse(char *data_in, char *data_out)
{
.....
*data_out = data_in; //这样传递可以吗???
.....
}

2)片段2:
int aa;
char *packages;
......
aa= *(int *)packages; //这里指针packages是如何将值传给非指针aa?
。。。。。
int counter;
*(int *)packages = counter; //类似上面的

谢谢大家。
发表于 2009-3-25 00:18:10 | 显示全部楼层
*pachages 就是 一个字符, 对吧, 而字符又是小整型, 8位, 其实 就可以 aa=*packages,
但是了 (int *)packages 先把packages强制转化为一个 int 型指针, 再在一个指针上面取值, 即前面的*packages.

对于 *(int *)packages = counter 也和上面类似, 你可以把 (int *) 不看, 那不就是 *packages=counter 而 packages 是一指针, 对一指针进行引用不就是里面的内容了。
回复 支持 反对

使用道具 举报

发表于 2009-3-25 09:54:27 | 显示全部楼层
*data_out = data_in; //这样传递可以吗???
data_in是指针指向的地址,*data_out是指针指向的值。这样传递就是把地址传给指针值向的值。可以这样传递。
回复 支持 反对

使用道具 举报

发表于 2009-3-25 13:27:08 | 显示全部楼层
> void parse(char *data_in, char *data_out)
> *data_out = data_in; //这样传递可以吗???
data_in 是个 char *
*data_out 是个 char ,两者类型不同。通常来说指针会比 char 大,所以这样传递会带来问题。


> aa= *(int *)packages; //这里指针packages是如何将值传给非指针aa?
建议换本新书看看,把指针装进 int 会带来不必要的灾难。尤其对于64位系统(指针64位,int为32位)。
C语言标准并没有定义int型能够装进一个指针,只定义了long型能够装进指针。所以应当完全避免把指针装进int的错误编程习惯。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-25 21:16:29 | 显示全部楼层
谢谢大家了,我再消化一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-25 21:45:50 | 显示全部楼层
Post by zyl19861126;1965098
*pachages 就是 一个字符, 对吧, 而字符又是小整型, 8位, 其实 就可以 aa=*packages,
但是了 (int *)packages 先把packages强制转化为一个 int 型指针, 再在一个指针上面取值, 即前面的*packages.

对于 *(int *)packages = counter 也和上面类似, 你可以把 (int *) 不看, 那不就是 *packages=counter 而 packages 是一指针, 对一指针进行引用不就是里面的内容了。
packages显然不是一个字符,不然就没必要用指针了。
你的解释也没看懂。
回复 支持 反对

使用道具 举报

发表于 2009-3-26 08:06:15 | 显示全部楼层
我没说 pachages 是一个字符吧, 我说*pakages是个一个字符吧, char *packages, 不就定义 packages 是一个字符指针, 比如 你要是 char *packages="woshizhong"; 那么 packages 指针指向字符串的第一个地址, *packages 不就是 'w' 这个字符了, *(packages+N) 不就是第 N 个字符了。。。。。 而 (int *packages)又与前面的 packages 有点不同, 假如 int 为 32位的话, *(packages+1)为 'o' , 那么 *((int *)packages + 1) 就为 'i'。。。
回复 支持 反对

使用道具 举报

发表于 2009-3-26 08:41:26 | 显示全部楼层
Post by poet;1965306
> void parse(char *data_in, char *data_out)
> *data_out = data_in; //这样传递可以吗???
data_in 是个 char *
*data_out 是个 char ,两者类型不同。通常来说指针会比 char 大,所以这样传递会带来问题。


> aa= *(int *)packages; //这里指针packages是如何将值传给非指针aa?
建议换本新书看看,把指针装进 int 会带来不必要的灾难。尤其对于64位系统(指针64位,int为32位)。
C语言标准并没有定义int型能够装进一个指针,只定义了long型能够装进指针。所以应当完全避免把指针装进int的错误编程习惯。


*data_out = date_in // 确实是将 指针地址赋值给一个 char 类型, char 类型,取指针的前8位。。。

aa=*(int *)packages // 不是将指针赋值给int型。
                                    packages 是一个指向char的指针, 但是 *packages确是一个字符, 而 aa = *packages 确是将一个 char 赋值给 int 型; 那么 (int *)packages 不同在于, 将 一个 字符型指针强制转化为 int 型指针;
举个例子:
int aa, *bb, cc;
char *packages="woshizhong";

bb = (int *)packages; // 这样 *bb 不就是等于 *(int *)packages么?
aa=*packages; // 此时 aa 从 *packages取得一个字符 w, 8位。 其余位不确定。
cc=*bb;           // 而cc取得字符'wosh'(假定 int 为32位, 可以用sizeof(int)确定)。

现在可以验证, printf( "%c , %c, %c,  %c\n", aa, cc, *((char *)&cc + 1), *(bb + 1) ); \\ aa 打印前8位 为 w, 而 cc 一样, 而后一个打印 'o', 而现在 bb 为32 位指针, bb+1自然指向 'i';
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-26 21:51:24 | 显示全部楼层
谢谢你的说明。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表