scipy.optimize.minimize
对于第一个#include<stdio.h>
int main()
{
int arr[] = {10, 20, 30, 40, 50, 60};
int *ptr1 = arr;
int *ptr2 = arr + 5;
printf("Number of elements between two pointer are: %d.",
(ptr2 - ptr1));
printf("Number of bytes between two pointers are: %d",
(char*)ptr2 - (char*) ptr1);
return 0;
}
语句,根据Pointer subtraction confusion
printf()
第二个5
语句怎么样,输出是什么?
答案 0 :(得分:9)
引用C11
,章节§6.5.6,添加剂操作符
当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素;结果是两个数组元素的下标不同。
所以,当你在做
时printf("Number of elements between two pointer are: %d.",
(ptr2 - ptr1));
ptr1
和ptr2
都是指向int
的指针,因此它们给出了下标5中的差异。换句话说,地址的差异在参考sizeof(<type>)
。
OTOH,
printf("Number of bytes between two pointers are: %d",
(char*)ptr2 - (char*) ptr1);
ptr1
和ptr2
都已经指向char
的指针,该指针的大小为1个字节。计算相应地进行。结果:20
。
FWIW ,请注意,减去两个指针会产生ptrdiff_t
类型的结果,您应该使用%td
格式说明符来打印结果。
答案 1 :(得分:5)
如果有两个类型为T
的指针指向同一个数组的元素,那么指针的差异会产生这些指针之间类型T
的元素数
所以第一个输出语句
printf("Number of elements between two pointer are: %d.",
(ptr2 - ptr1));
输出5 - 指针int
和ptr1
之间类型ptr2
的元素数。
这就是所谓的指针算法。
指针(char*)ptr1
和(char*)ptr2
具有与原始指针ptr1
和ptr2
相同的值,但是他们将内存范围视为(重新解释)为类型{{ 1}}每个元素的大小等于char
。在C sizeof( char )
中始终等于1。
因此,差异sizeof( char )
给出了可以适合内存范围的( char * )ptr2 - ( char * ) ptr1
类型的元素数。很明显
char
不大于sizeof( char )
。因此,相同的内存范围可以容纳sizeof( int )
类型的更多元素而不是类型char
。如果例如int
等于sizeof( int )
,那么内存范围可以容纳4
5 * sizeof( int )
类型的char
元素。
答案 2 :(得分:4)
指针算术总是以基本类型为单位。
在你的情况下,你有
int *ptr1 = ...
然后执行ptr1 + 5
会将sizeof(*ptr1) * 5
字节添加到指针ptr1
。考虑到sizeof(*ptr1)
(与sizeof(int)
相同)是4
,那么您得到的4 * 5
等于20
个字节。
答案 3 :(得分:4)
每个数组元素都是int
,两个指针之间都有5
个元素。因此,两个指针之间将有5*sizeof(int)
个字节。