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

2025-01-04 15:30:01
推荐回答(5个)
回答1:

没有意思吧 ,给出的信息太少

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

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

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

如果编译器将栈空间初始化0,那还是访问违例!
我是菜鸟,希望能帮到你,观楼主英俊潇洒,风流倜傥,必当世豪杰,诚邀加入0x30百度贴吧,共商义举,建不世之功!

回答2:

这是一个特性
C/C++有很多这样的定义
typedef struct {
unsigned long size;//指示大小
//...
long value[];//有些是value[0] 编译器支持其中一种或全部,就算是C/C++中的挂羊头卖狗肉
}same_name;
这类的对象是在自己获取的内存块中定义的,是另类的可变长数组。
在参数传递中,数组对象会传地址,也就是指针,所以必须支持 指针可以和数组一样带下标来实现解引用。

回答3:

这样的代码运行没有任何意义,tempstr指针声明只是在内存中指定了一个能存储unsigned char类型变量的位置,但没有开辟内存空间,因此tempstr[1]的结果是不可预料的。

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

tempstr[1] = 'a';

//...

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

return 0;

}

回答4:

tempstr仅仅是一个字符数组的首字符地址,tempstr[1],就表示第二个字符

回答5:

你定义的是指针,指针是可以作为数组使用的。