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;
} 展开
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;
} 展开
5个回答
展开全部
没有意思吧 ,给出的信息太少
unsigned char *tempstr;
tempstr[1];
这两句代码是花码, 根本不会产生任何指令,即不生成任何可执行的机器码。
如果说你把指针当成数组。
unsigned char *tempstr;
tempstr[1];
printf("%c", tempstr[1]) //这个执行要看具体的编译器。
如果说你是vc使用的debug版,因为栈空间被初始化为0xcc,所以你输出的是地址 0xccccccc处的内容,显然这是一次内存访问违例, 所以程序会死掉
如果编译器将栈空间初始化0,那还是访问违例!
我是菜鸟,希望能帮到你,观楼主英俊潇洒,风流倜傥,必当世豪杰,诚邀加入0x30百度贴吧,共商义举,建不世之功!
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中。
展开全部
这是一个特性
C/C++有很多这样的定义
typedef struct {
unsigned long size;//指示大小
//...
long value[];//有些是value[0] 编译器支持其中一种或全部,就算是C/C++中的挂羊头卖狗肉
}same_name;
这类的对象是在自己获取的内存块中定义的,是另类的可变长数组。
在参数传递中,数组对象会传地址,也就是指针,所以必须支持 指针可以和数组一样带下标来实现解引用。
C/C++有很多这样的定义
typedef struct {
unsigned long size;//指示大小
//...
long value[];//有些是value[0] 编译器支持其中一种或全部,就算是C/C++中的挂羊头卖狗肉
}same_name;
这类的对象是在自己获取的内存块中定义的,是另类的可变长数组。
在参数传递中,数组对象会传地址,也就是指针,所以必须支持 指针可以和数组一样带下标来实现解引用。
追问
感谢提示,数组和指针的形式相同,数组即指针,例如*[a+3]是否可以理解为a[3];
追答
*(a+i) 和a[i]的结果是一样的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样的代码运行没有任何意义,tempstr指针声明只是在内存中指定了一个能存储unsigned char类型变量的位置,但没有开辟内存空间,因此tempstr[1]的结果是不可预料的。
正确的写法应该是
int main(){
unsigned char *tempstr = new unsigned char[10]; //动态开辟内存并将起始指针赋给tempstr
tempstr[1] = 'a';
//...
delete [] tempstr; //释放内存很重要,是一个有经验程序员的标志
return 0;
}
正确的写法应该是
int main(){
unsigned char *tempstr = new unsigned char[10]; //动态开辟内存并将起始指针赋给tempstr
tempstr[1] = 'a';
//...
delete [] tempstr; //释放内存很重要,是一个有经验程序员的标志
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
tempstr仅仅是一个字符数组的首字符地址,tempstr[1],就表示第二个字符
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你定义的是指针,指针是可以作为数组使用的。
追问
那为什么无法用于输出或者计算,比如使用计算时或者使用std::cout时可以通过编译却无法正常输出
追答
数组的大小你没定义,tempstr[1]取不到。取到了,你也没初始化。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询