C/C++中定义为unsigned char *型非数组,为什么在使用时可以为数组,表示的是什么意思?

#include<iostream>intmain(){unsignedchar*tempstr;tempstr[1];return0;}//但是无法用于输出或计算;简化... #include <iostream>
int main()
{
unsigned char *tempstr;
tempstr[1];
return 0;
}
//但是无法用于输出或计算;
简化的太严重了,稍微复原一下:
typedef struct COMRECEIVEBUFFER_tag
{
unsigned char *tempstr;
}COMRECEIVEBUFFER;COMRECEIVEBUFFER ComRBuffer[2];

enum COMRECEIVEBUFFER_enum{COMR_ANOTHERSYSTEM1,COMR_ANOTHERSYSTEM2};

int main()

{
int i=1; int check;
check=check^ComRBuffer[COMR_ANOTHERSYSTEM1].tempstr[i];
return 0;
}
展开
 我来答
吉祥二进制
高粉答主

2013-07-15 · 科技改变生活,生活改变科技。
吉祥二进制
采纳数:33926 获赞数:84577

向TA提问 私信TA
展开全部
没有意思吧 ,给出的信息太少

unsigned char *tempstr;
tempstr[1];
这两句代码是花码, 根本不会产生任何指令,即不生成任何可执行的机器码。

如果说你把指针当成数组。
unsigned char *tempstr;
tempstr[1];
printf("%c", tempstr[1]) //这个执行要看具体的编译器。

如果说你是vc使用的debug版,因为栈空间被初始化为0xcc,所以你输出的是地址 0xccccccc处的内容,显然这是一次内存访问违例, 所以程序会死掉

如果编译器将栈空间初始化0,那还是访问违例!
我是菜鸟,希望能帮到你,观楼主英俊潇洒,风流倜傥,必当世豪杰,诚邀加入0x30百度贴吧,共商义举,建不世之功!
更多追问追答
追问
这个简化了一下,没想到简化的太严重了,稍微复原一下:
typedef struct COMRECEIVEBUFFER_tag
{
unsigned char *tempstr;
}COMRECEIVEBUFFER;
追答
你学习过动态内存的创建过程吗? int *p = new int [20]; 这时候指针就可以当成一个数组的。 看你的结构。COMRECEIVEBUFFER_tag 从名字可以看出它是一个缓冲区BUFFER,因此它在使用的时候,肯定使用了动态内存来分配数组, 
比如  OMRECEIVEBUFFER test;

test.*tempstr = new unsigned char [ 20];//c++中动态分配了一个20个元素的数组,这个数组的始地址保存在tempstr中。
hu0904
2013-07-15 · TA获得超过222个赞
知道小有建树答主
回答量:510
采纳率:0%
帮助的人:459万
展开全部
这是一个特性
C/C++有很多这样的定义
typedef struct {
unsigned long size;//指示大小
//...
long value[];//有些是value[0] 编译器支持其中一种或全部,就算是C/C++中的挂羊头卖狗肉
}same_name;
这类的对象是在自己获取的内存块中定义的,是另类的可变长数组。
在参数传递中,数组对象会传地址,也就是指针,所以必须支持 指针可以和数组一样带下标来实现解引用。
追问
感谢提示,数组和指针的形式相同,数组即指针,例如*[a+3]是否可以理解为a[3];
追答
*(a+i) 和a[i]的结果是一样的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Lotayou
2013-07-15 · TA获得超过382个赞
知道小有建树答主
回答量:347
采纳率:0%
帮助的人:94.7万
展开全部
这样的代码运行没有任何意义,tempstr指针声明只是在内存中指定了一个能存储unsigned char类型变量的位置,但没有开辟内存空间,因此tempstr[1]的结果是不可预料的。

正确的写法应该是
int main(){
unsigned char *tempstr = new unsigned char[10]; //动态开辟内存并将起始指针赋给tempstr

tempstr[1] = 'a';

//...

delete [] tempstr; //释放内存很重要,是一个有经验程序员的标志

return 0;

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Magic_旭
2013-07-15 · 超过41用户采纳过TA的回答
知道答主
回答量:287
采纳率:100%
帮助的人:119万
展开全部
tempstr仅仅是一个字符数组的首字符地址,tempstr[1],就表示第二个字符
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
120384523
2013-07-15 · 超过20用户采纳过TA的回答
知道答主
回答量:149
采纳率:100%
帮助的人:54.6万
展开全部
你定义的是指针,指针是可以作为数组使用的。
追问
那为什么无法用于输出或者计算,比如使用计算时或者使用std::cout时可以通过编译却无法正常输出
追答
数组的大小你没定义,tempstr[1]取不到。取到了,你也没初始化。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式