一个简单却又极易引起疑惑的数组指针有关问题
一个简单却又极易引起疑惑的数组指针问题各位大侠,请教以下问题: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 吧?
[解决办法]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了
[解决办法]
你再运行一次,b的值就不一定是-47了吧??
应该给buf[]这个数组的地址有关,分给它不同的地址,b的值就不同吧
[解决办法]
char b = (char)(buf + 5);
应为
char b = *(buf + 5);
[解决办法]
[解决办法]
char的范围是-128~127 所以a=-125
char b = (char)(buf + 5); 是把buf+5的地址强制转换为char 而不是获取buf[5]的值
可改为char b = *buf + 5);