插入元素到数组相应位置并输出

img


为什么左边的“查看列表”里面len是2呢?
我以为数组sizeof是11 * 4
首元素sizeof是4
两个相除不是11吗?怎么得到的2。
以及如何正确更改(注:下面两个注释之间的代码是题目固定的,不能对那部分变动)?
谢谢各位了!

#include<stdio.h>
int insert (int a [],int num){
    int i;
    int len = sizeof(a)/sizeof(a[0]);
    if(num > a[len - 2]) {
    a[len - 1] = num;
    return 0;
}
    for(i = 0;i < len - 2;i++){
        if(a[i] > num){
            int j;
            for(j = len - 2;j >= i;j--){
                a[j+1] = a[j];
            }
            a[i] = num;
            break;
        }
    }
    return 0;
}
//StudybarCommentBegin
int main()
{
int a[11]={10,20,30,40,50,60,70,80,90,100};
int number,i;
scanf("%d",&number);
insert(a,number);
for(i=0;i<11;i++)
  printf("%d ",a[i]);
  return 0;
}
//StudybarCommentEnd

该回答引用自ChatGPT:在C语言中,数组作为函数参数传递时会退化为指针,因此无法在函数内部通过sizeof运算符获取数组的真实长度。

在你的代码中,int len = sizeof(a)/sizeof(a[0]);这行代码计算的结果是错误的,因为此时a已经被退化为指向int类型的指针,所以sizeof(a)的结果是指针的大小,而不是数组的大小。因此,len的值会被错误地计算为2。

要解决这个问题,你可以将数组的长度作为参数传递给insert函数。这样,函数就能够正确地知道数组的长度。

下面是修改后的代码示例:

#include<stdio.h>

int insert(int a[], int num, int len) {
    int i;
    if (num > a[len - 2]) {
        a[len - 1] = num;
        return 0;
    }
    for (i = 0; i < len - 2; i++) {
        if (a[i] > num) {
            int j;
            for (j = len - 2; j >= i; j--) {
                a[j + 1] = a[j];
            }
            a[i] = num;
            break;
        }
    }
    return 0;
}

int main() {
    int a[11] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int number, i;
    int len = sizeof(a) / sizeof(a[0]);  // 计算数组的长度
    scanf("%d", &number);
    insert(a, number, len);  // 将数组长度作为参数传递
    for (i = 0; i < 11; i++)
        printf("%d ", a[i]);
    return 0;
}

通过在main函数中计算数组的长度并将其传递给insert函数,你可以避免对数组长度的错误计算,并使代码正常运行。

数组传递到函数,退化成指针
不能用sizeof,要把长度作为一个参数传入函数

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7775353
  • 除此之外, 这篇博客: <C>.操作符&&数据类型中的 sizeof操作符,是计算类型创建的变量所占的大小,单位是字节 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • sizeof是一个操作符,他不是函数。

    	printf("%d\n", sizeof a);//括号是可以去掉的,所以不是函数
    	printf("%d\n", sizeof(a));
    	printf("%d\n", sizeof(int));  //当是类型时,括号不能去掉

    接下来看这道题

    int main()
    {
    
    	int a = 10;
    	short s = 0;
    	printf("%d\n", sizeof(s = a + 2));
    	printf("%d\n", s);                
    	return 0;
    }
    	

    结果是 2和0,为什么不是2和12呢 

    因为sizeof括号里的表达式是不参与计算的,sizeof在编译期间,就已经把表达式给处理掉了

     

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以为你提供一些关于如何在数组中插入元素到指定位置并输出整个数组的解决方案。要回答你的问题,首先需要了解数组的一些基础概念。

    在C语言中,数组的大小是由元素的数量和元素的大小决定的。因此,如果你有一个存储int类型元素的数组,数组大小应该为元素数量乘以每个int元素的大小,即数组大小等于11 * 4字节,或者44字节。

    有关在一个数组中插入元素到指定位置并输出整个数组的问题,具体的解决方案如下:

    1. 首先,你需要声明一个数组,并根据其元素的数量和元素的大小来分配足够的内存。例如,以下代码声明了一个长度为10的int类型数组:
    int arr[10];
    
    1. 然后,你需要为数组中的每个元素分配一个值。例如,以下代码将数组中的第三个元素设置为10:
    arr[2] = 10;
    
    1. 接下来,你需要将新元素插入到数组的指定位置。为了避免数组中的元素覆盖,你应该从数组的末尾开始移动元素。为此,你可以创建一个循环来将数组中的每个元素向后移动一位。以下代码演示了这一点:
    int i;
    for (i = 9; i > 5; i--) {
        arr[i] = arr[i-1];
    }
    

    在本例中,从数组的第6个元素开始向后移动,直到数组的第10个元素。在每次循环迭代中,将当前元素设置为前一个元素的值。

    1. 在将新元素插入到数组的指定位置后,你可以将指定位置的元素设置为所需的值。例如,以下代码将数组中的第6个元素设置为12:
    arr[5] = 12;
    
    1. 最后,你可以使用循环遍历整个数组并打印每个元素的值。以下代码演示了如何在控制台中输出所有数组元素的值:
    int i;
    for (i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    
    printf("\n");
    

    现在,当你运行程序时,数组中的所有元素将被打印到控制台中。

    关于代码中的注释,请确保你完全理解程序中的每一行代码,不要仅仅依赖于注释。

    如果你遇到了困难或需要更详细的解释,请告诉我。否则,请尝试使用这些解决方案自行解决问题。