1. unsigned short (*)[]与unsigned short *的异同
- 都是指针
- 前者指向unsigned short数组,后者指向unsigned short元素
unsigned short my_array[] = { 1, 2, 3, 4, 5 };
unsigned short(*my_pointer1)[5];
my_pointer1 = &my_array;
unsigned short *my_pointer2 = my_array;
cout << sizeof(*my_pointer1) << endl;
cout << sizeof(*my_pointer2) << endl;
运行结果为:
10 // 为unsigned short数组的大小
2 // 为单个unsigned short元素的大小
2. 如何把unsigned short (*)[]转换为unsigned short *
将unsigned short (*)[]转换为unsigned short *是不安全的操作。
因为这会导致指针丢失数组的维度和大小信息,如上例子所示。
如果必须这样做,请使用C++中的强制类型转换来进行:
unsigned short (*p)[n];
unsigned short* ptr = reinterpret_cast<unsigned short*>(p);
3. 静态数组是如何保存维度信息的
数组是一个类型,在编译器的符号表中包含了数组名、类型、元素个数等信息。
当编译器遇到一个数组定义时,它会为数组分配内存空间,并将数组的大小存储在符号表中。
这样,在程序执行时,我们就可以通过数组名来获取数组的地址,并且可以使用sizeof运算符来获取数组的大小。
上面说的是静态数组。
对于静态数组(即在函数外部定义的数组),编译器会在符号表中存储数组的大小,包括元素个数。
因此,我们可以使用sizeof运算符来获取整个数组的大小,也可以通过数组元素个数和元素大小来计算数组的大小。
对于动态分配的数组(即在程序运行时使用malloc等函数分配的数组),由于数组大小是在运行时动态确定的。
因此编译器不会在符号表中存储数组的大小信息。在使用动态数组时,我们通常需要将数组大小显式地存储在变量中,并在程序中使用这个变量来进行数组操作。






网友评论