我们可以向整数添加数组变量吗? [英] Can we add an array variable to integer?
问题描述
这是一个程序,用于查找两个排序数组的中值。
基于分治法的有效解决方案,用于查找两个相同大小的排序数组的中值。
p> #include< bits / stdc ++。h>
使用命名空间std;
int中位数(int [],int); / *获得排序数组的中位数* /
/ *此函数返回ar1 []和ar2 []的中值。
此函数的假设:
ar1 []和ar2 []都是已排序的数组
都具有n个元素* /
int getMedian(int ar1 [],int ar2 [] ,int n)
{
/ *对于无效输入返回-1 * /
如果(n <= 0)
返回-1;
if(n == 1)
return(ar1 [0] + ar2 [0])/ 2;
if(n == 2)
return(max(ar1 [0],ar2 [0])+ min(ar1 [1],ar2 [1]))/ 2;
int m1 =中位数(ar1,n); / *获得第一个数组的中位数* /
int m2 =中位数(ar2,n); / *获得第二个数组的中位数* /
/ *如果中位数相等,则返回m1或m2 * /
如果(m1 == m2)
返回m1 ;
/ *如果m1 < m2,则中位数必须存在于ar1 [m1 ....]和
ar2 [.... m2] * /
中,如果(m1 {
if (n%2 == 0)
{
return getMedian(ar1 + n / 2-1,ar2,n-n / 2 +1);
}
返回getMedian(ar1 + n / 2,ar2,n-n / 2);
}
/ *如果m1> m2,则中位数必须存在于ar1 [.... m1]和
ar2 [m2 ...] * /
中,如果(n%2 == 0)
返回getMedian(ar2 + n / 2-1,ar1,n-n / 2 +1);
return getMedian(ar2 + n / 2,ar1,n-n / 2);
}
/ *函数获取排序数组的中位数* /
int average(int arr [],int n)
{
if (n%2 == 0)
返回(arr [n / 2] + arr [n / 2-1])/ 2;
else
return arr [n / 2];
}
/ *测试上述功能的驱动程序* /
int main()
{
int ar1 [] = {1,2,3 3,6};
int ar2 [] = {4,6,8,10};
int n1 = sizeof(ar1)/ sizeof(ar1 [0]);
int n2 = sizeof(ar2)/ sizeof(ar2 [0]);
if(n1 == n2)
printf( Median is%d,getMedian(ar1,ar2,n1));
else
printf(不适用于大小不等的数组);
返回0;
}
我的问题是如何向整数添加数组变量。我的意思是,当我们在getmedian函数调用中这样做(ar1 + n / 2-1)时,它是否指向内存?
在表达式中,数组指示符隐式转换为指向其第一个元素的指针。将整数添加到指针,您将再次获得一个指针。所谓的指针算术。
因此,例如,如果您有数组
int a [] = {0,1,2,3,4,5,6,7,8,8};
const size_t N = sizeof(a)/ sizeof(* a);
然后表达式
a + N / 2
将指向数组的第六个元素。 / p>
这是一个演示程序
#include< stdio.h> ;
int main(void)
{
int a [] = {0,1,2,3,4,5,6,7,8,9};
const size_t N = sizeof(a)/ sizeof(* a);
for(size_t i = 0; i< N; i ++)printf(%p:%d\n,a + i,*(a + i));
返回0;
}
其输出看起来像
0xbfd3d9c8:0
0xbfd3d9cc:1
0xbfd3d9d0:2
0xbfd3d9d4:3
0xbfd3d9d8:4
0xbfdd3d3d 5
0xbfd3d9e0:6
0xbfd3d9e4:7
0xbfd3d9e8:8
0xbfd3d9ec:9
另外,将声明为数组的函数参数也调整为指针。因此,例如,这些函数声明
int中位数(int a [100],int n);
int中位数(int a [10],int n);
int中位数(int a [],int n);
int中位数(int * a,int n);
等价并声明相同的一个函数。
This is a program to find median of two sorted arrays.
A divide and conquer based efficient solution to find median of two sorted arrays of same size.
#include<bits/stdc++.h>
using namespace std;
int median(int [], int); /* to get median of a sorted array */
/* This function returns median of ar1[] and ar2[].
Assumptions in this function:
Both ar1[] and ar2[] are sorted arrays
Both have n elements */
int getMedian(int ar1[], int ar2[], int n)
{
/* return -1 for invalid input */
if (n <= 0)
return -1;
if (n == 1)
return (ar1[0] + ar2[0])/2;
if (n == 2)
return (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1])) / 2;
int m1 = median(ar1, n); /* get the median of the first array */
int m2 = median(ar2, n); /* get the median of the second array */
/* If medians are equal then return either m1 or m2 */
if (m1 == m2)
return m1;
/* if m1 < m2 then median must exist in ar1[m1....] and
ar2[....m2] */
if (m1 < m2)
{
if (n % 2 == 0)
{
return getMedian(ar1 + n/2 - 1, ar2, n - n/2 +1);
}
return getMedian(ar1 + n/2, ar2, n - n/2);
}
/* if m1 > m2 then median must exist in ar1[....m1] and
ar2[m2...] */
if (n % 2 == 0)
return getMedian(ar2 + n/2 - 1, ar1, n - n/2 + 1);
return getMedian(ar2 + n/2, ar1, n - n/2);
}
/* Function to get median of a sorted array */
int median(int arr[], int n)
{
if (n%2 == 0)
return (arr[n/2] + arr[n/2-1])/2;
else
return arr[n/2];
}
/* Driver program to test above function */
int main()
{
int ar1[] = {1, 2, 3, 6};
int ar2[] = {4, 6, 8, 10};
int n1 = sizeof(ar1)/sizeof(ar1[0]);
int n2 = sizeof(ar2)/sizeof(ar2[0]);
if (n1 == n2)
printf("Median is %d", getMedian(ar1, ar2, n1));
else
printf("Doesn't work for arrays of unequal size");
return 0;
}
My question is how can I add a array variable to an integer. I means whether it is referring to memory when we do like this (ar1 + n/2 - 1) here in the getmedian function call ?
In expressions an array designator is implicitly converted to the pointer to its first element. Adding an integer to a pointer you will get again a pointer. It is so called the pointer arithmetic.
Thus for example if you have an array
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const size_t N = sizeof( a ) / sizeof( *a );
then expression
a + N / 2
will point to the sixth element of the array.
Here is a demonstrative program
#include <stdio.h>
int main(void)
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const size_t N = sizeof( a ) / sizeof( *a );
for ( size_t i = 0; i < N; i++ ) printf( "%p: %d\n", a + i, *( a + i ) );
return 0;
}
Its output might look like
0xbfd3d9c8: 0
0xbfd3d9cc: 1
0xbfd3d9d0: 2
0xbfd3d9d4: 3
0xbfd3d9d8: 4
0xbfd3d9dc: 5
0xbfd3d9e0: 6
0xbfd3d9e4: 7
0xbfd3d9e8: 8
0xbfd3d9ec: 9
Also a function parameter declared like an array is also adjusted to pointer. So for example these function declarations
int median(int a[100], int n);
int median(int a[10], int n);
int median(int a[], int n);
int median(int *a, int n);
are equivalent and declare the same one function.
这篇关于我们可以向整数添加数组变量吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!