我们可以向整数添加数组变量吗? [英] Can we add an array variable to integer?

查看:60
本文介绍了我们可以向整数添加数组变量吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个程序,用于查找两个排序数组的中值。



基于分治法的有效解决方案,用于查找两个相同大小的排序数组的中值。

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆