C (*指针)[]和*指针之间有什么区别?
我有一个关于使用指针的问题。你能告诉我这两个指针的区别吗C (*指针)[]和*指针之间有什么区别?,c,arrays,pointers,C,Arrays,Pointers,我有一个关于使用指针的问题。你能告诉我这两个指针的区别吗 int array[10] = {1, }; int (*pointer1)[10] = &array; int *pointer2 = array; 我很困惑,因为这两个指针可以做完全相同的事情。。。与访问元素(如pointer1[0]或pointer2[0])一样,我理解pointer2是元素指针,而pointer1是指向整个数组的指针。但我不知道为什么编程人员会区分这两种类型。在大多数上下文中,数组名会退化为指针。简单地说
int array[10] = {1, };
int (*pointer1)[10] = &array;
int *pointer2 = array;
我很困惑,因为这两个指针可以做完全相同的事情。。。与访问元素(如
pointer1[0]
或pointer2[0]
)一样,我理解pointer2
是元素指针,而pointer1
是指向整个数组的指针。但我不知道为什么编程人员会区分这两种类型。在大多数上下文中,数组名会退化为指针。简单地说,数组名被转换为指针。这就是为什么可以使用指针访问数组元素的原因。但是,您应该记住指针和数组是不同的
由于C
中的数组可以衰减到具有相同数据类型的指针(并且数组的名称可以衰减到数组的地址或相同的第一个元素的地址)
我们可以写:
int* ptr = array;
ptr是指向阵列开始的新数据类型
现在有什么共同点:
指针1
和指针2
将内存中相同的地址点保存到相同的地址
但它们之间有一些区别:
pointer1
是指向10个整数数据类型的数组的指针,其中pointer2
是指向一个整数数据类型的指针
当解除法语时
指针:
pointer2
deref到一个int数据类型,其中pointer1
被deref到10个int的数组。因此,我们可以使用指针1
:
(*pointer1)[5]=1000;
但这将在指针2中有效
指针2中的相等值为:
*(pointer2+5)=1000;
指针算法在这两种情况下都有效,但增量的结果不同:
int* ptr_new = pointer1 + 1;
将整个数组的指针1
增加大小(10个整数),现在ptr_新点指向最后一个元素
int* ptr_new = pointer2 + 1;
int array[10];
按sizeof(int)
递增pointer2
,现在ptr\u新点指向数组中的第二个元素。数组衰减为指向其第一个元素的引用的指针
int* ptr_new = pointer2 + 1;
int array[10];
array
衰减为指向int的指针
&数组[0]
衰减为指向int的指针
&array[
衰减到指向10元素整数数组的指针
指向int的指针和指向int数组的指针之间有什么区别?它们引用不同类型的对象,并且它们的算法不同,如下示例所示:
int array[10] = {1, };
int (*pointer1)[10] = &array;
int *pointer2 = array;
int main(void)
{
printf("sizeof(int) is: %zu, sizeof(*pointer2) is: %zu, sizeof(*pointer1) is: %zu\n", sizeof(int), sizeof(*pointer2), sizeof(*pointer1));
printf("pointer1 = %p, (pointer1 + 1) = %p, (pointer1 + 1) - pointer1 = %zu\n", (void *)pointer1, (void *)(pointer1 + 1), (uint8_t *)(pointer1 + 1) - (uint8_t *)(pointer1));
printf("pointer2 = %p, (pointer2 + 1) = %p, (pointer2 + 1) - pointer2 = %zu\n", (void *)pointer2, (void *)(pointer2 + 1), (uint8_t *)(pointer2 + 1) - (uint8_t *)(pointer2));
}
结果是:
sizeof(int) is: 4, sizeof(*pointer2) is: 4, sizeof(*pointer1) is: 40
pointer1 = 0x404040, (pointer1 + 1) = 0x404068, (pointer1 + 1) - pointer1 = 40
pointer2 = 0x404040, (pointer2 + 1) = 0x404044, (pointer2 + 1) - pointer2 = 4
谢谢你的回答!@Gazelgoes-我的荣幸。谢谢你的提问。