我现在在这里问了几个问题,大家都不喜欢,所以我会把问题说得简短些。
我试图为int做一个动态分配的数组,然后我想给它分配一个常量数组以供测试,但我做不到。
当我们想要创建一个字符数组时,我们编写: char *arr = "abc";
它不是这样工作的: int *arr = {1,2,3};
但当我这样做时,它确实起作用了: int *arr = (int[]) {1,2,3};
老实说,我不知道那个演员是怎么做的,我很高兴,直到我试着得到元素的数量: int n=sizeof of (Arr)/sizeof(Int);
谢谢。
发布于 2022-08-25 13:40:39
,演员是如何让它工作的?
字符串文字在C中是一个特别受支持的“语法糖”,它是一个未命名的char静态数组,并附加了一个'\0'。这就是为什么您不需要在这样的初始化中提供类型信息的原因。顺便说一下,不要试图修改它的任何元素,它是没有定义的。
char *arr = "abc";对于任何其他类型的数组,您需要帮助编译器确定正确的类型。因此,您将该表达式“扩展”到复合文字。这不是一个演员:
int *arr = (int[]){ 1, 2, 3, };如何将这个数组传递给
()?
sizeof是一个一元运算符,如- (作为数值的负号)和~。
它的操作数是对象或类型。后者需要放在括号中。
但是,由于您声明arr是指向数组的第一个元素的指针,所以您丢失了有关数组大小的信息。因此,sizeof,,您不能使用,,,here,来获取arr指向的元素数。
解决方案是分别存储这些信息。
如果软件设计允许,则可以将数组定义为实际数组。
int arr[] = { 1, 2, 3, };现在您可以获得这个数组中的元素数:
size_t n = sizeof arr / sizeof arr[0];发布于 2022-09-15 05:40:12
sizeof不是(运行时)函数调用。当大小正确使用时,很少需要"()“。
char *p = "abc"; // pointer to 4 byte read-only array
int n = sizeof *p; // "sizeof' is compiler "facility". @ compile time *p can be measuredchar p[] = "abc"; // mutable 4 byte array, initialised 'a','b','c','\0'
int n = sizeof p; // can be measured at compile timechar *p = NULL; // p could be assigned to point anywhere
p = "abc";
int n = strlen( p ); // runtime function call on a pointer to a null terminated stringint arr[] = { 1, 2, 3, 4, }; // compiler secretly includes code initialising array
int n = sizeof arr/sizeof arr[0]; // compiler "knows" these dimensions, so sizeof "works"最后一个示例将有效地简化为4 x sizeof int / sizeof int然后是4x4/4然后是4,这个定义与int n = 4;相同,但由精确的编译器计算。
重复: time不是一个运行时函数调用;它是一个编译时“设施”(又名“操作符”)。
https://stackoverflow.com/questions/73488365
复制相似问题