Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C (*指针)[]和*指针之间有什么区别?_C_Arrays_Pointers - Fatal编程技术网

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-我的荣幸。谢谢你的提问。