如何解决用C语言转换指针语法到较小的数组之类的数组地址
我有一个包含10个int
元素的数组,我想指向该数组的指针,不是全角而是一半。这样,我可以使用ptr
到达前5个元素,并通过增加指针ptr++
达到后5个元素。
我只想知道如何投射,我不需要知道变通办法或并集或结构或其他任何内容... 我只是想知道这种事情的语法。
这是我奋斗的例子;
// Pointer to an integer
int *p;
// Pointer to an array of 5 integers
int (*ptr)[5]; // this could be void*
int arr[10];
// Points to 0th element of the arr.
p = arr;
// Points to the whole array arr.
ptr = (int[5]*)&arr; // when arr sized as 5,ptr = &arr; gives result a pointer "ptr" with size of 5
printf("p = %p,ptr = %p\n",p,ptr);
p++;
ptr++;
printf("p = %p,ptr);
return 0;
注意: 答案是:ptr =(int(*)[5])&arr; (编译器的警告消息帮助我找到了此答案,它无法将其转换为另一种类型...)
但是我真的不知道()是什么,以及为什么它与int * [5]不同。我真的不明白括号的目的。
解决方法
如果我了解您的要求,这就是您想要的:
ptr = (int (*)[5]) &arr;
表达式&arr
的类型为int (*)[10]
(指向int
的10元素数组的指针)。由于ptr
的类型为int (*)[5]
(指向int
的5元素数组的指针),我们只需要将&arr
的结果强制转换为该类型。
记住以下优先规则:
T *a[N]; // a is an array of pointer to T
T (*a)[N]; // a is a pointer to an array of T
T *f(); // f is a function returning pointer to T
T (*f)(); // f is a pointer to a function returning T
一元*
的优先级低于[]
和()
,因此将类似*a[i]
的表达式解析为*(a[i])
-您正在取消引用结果a[i]
中的。如果a
是指向数组的指针,则需要将*
与a
进行显式分组,以便索引到a
指向-{ {1}}。
定义typedef
以使转换更容易。
typedef int (*int5ptr)[5];
// Pointer to an integer
int *p;
// Pointer to an array of 5 integers
int5ptr ptr;
int arr[10];
// Points to 0th element of the arr.
p = arr;
// Points to the whole array arr.
ptr = (int5ptr)&arr;
printf("p = %p,ptr = %p\n",p,ptr);
p++;
ptr++;
printf("p = %p,ptr);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。