首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个简单却又极易引起疑惑的数组指针有关问题

2012-05-04 
一个简单却又极易引起疑惑的数组指针问题各位大侠,请教以下问题:int main(){char buf[10] {0}buf[0]

一个简单却又极易引起疑惑的数组指针问题
各位大侠,请教以下问题:

int main()
{
char buf[10] = {0};

buf[0] = 0x7E;
buf[1] = 0x7F;
buf[2] = 0x80;
buf[3] = 0x81;
buf[4] = 0x82;
buf[5] = 0x83;

char a = buf[5];
char b = (char)(buf + 5);

return 0;
}

a的数值为-125,b的数值为-47.我的程序在VS2003上运行。

为什么会出现这种结果?

[解决办法]
这个C语言不能在中间声明char a 吧?


探讨
各位大侠,请教以下问题:

int main()
{
char buf[10] = {0};

buf[0] = 0x7E;
buf[1] = 0x7F;
buf[2] = 0x80;
buf[3] = 0x81;
buf[4] = 0x82;
buf[5] = 0x83;

char a = buf[5];
char b = (char)(buf + 5);

r……

[解决办法]
char b = (char)(buf + 5);
(buf+5)还是个char指针吧,要这样吧:char b= *(buf+5);
[解决办法]
你付的值,都超出了char的范围,char是有符号的,范围 -128~127
你可以用byte来替代char
[解决办法]
16进制...
还是少暴力的好...特指:(type)
[解决办法]
buf是一个数组,它所指向的位置上的数据是char [10],尺寸高达10个字节。

所以,你写:(char)(buf + 5),访问到的东西位于你数组后面40个字节的位置上。

如果你改写成:
char *p;
p=buf;
char a = buf[5];
char b = (char)(buf + 5);
那就能得到你想要的结果了。
因为,p所指向的数据尺寸就只有1字节,p+5时就是指向了p[5]。

记住这个:数组名仅仅是值为一个地址,本身并非指针。
[解决办法]
晕......手快了:
char *p;
p=buf;
char a = p[5];
char b = (char)(p + 5);
[解决办法]
buf[5]等价*(buf+5),而buf+5是个地址值
[解决办法]
C/C++ code
#include <stdio.h>#include <stdlib.h>int main(){    char a;    char b;    char buf[10] = {0};  //假设buf = 0x0014f874    buf[0] = 0x7E;    buf[1] = 0x7F;    buf[2] = 0x80;    buf[3] = 0x81;    buf[4] = 0x82;    buf[5] = 0x83;        a = buf[5];  //a = 0x83    b = (char)(buf + 5);  //buf + 5 = 0x0014f879, char 是一个字节,就是只取8位,所以(char)(buf + 5) = 0x79,所以我这儿b = 'y';    return 0;}
[解决办法]
a = 0x83,即 a = 131, 但a 的范围是-128 ~ 127, 所以 a = -125了

探讨

C/C++ code

#include <stdio.h>
#include <stdlib.h>

int main()
{
char a;
char b;
char buf[10] = {0}; //假设buf = 0x0014f874
buf[0] = 0x7E;
buf[1] = 0x7F;
buf[2] = 0x80;
bu……

[解决办法]
你再运行一次,b的值就不一定是-47了吧??

应该给buf[]这个数组的地址有关,分给它不同的地址,b的值就不同吧
[解决办法]
char b = (char)(buf + 5);
应为
char b = *(buf + 5);
[解决办法]
探讨

晕......手快了:
char *p;
p=buf;
char a = p[5];
char b = (char)(p + 5);

[解决办法]
char的范围是-128~127 所以a=-125
char b = (char)(buf + 5); 是把buf+5的地址强制转换为char 而不是获取buf[5]的值 
可改为char b = *buf + 5); 

热点排行