数组降维

news/2024/12/29 14:34:16/

写一个函数,打印数组内的内容,代码为:

#include<stdio.h>void show_arr(int arr[], int num)
{int i = 0;for (i = 0; i < num; i++){printf("%d ", arr[i]);}printf("\n");
}
int main()
{int arr[] = { 1,2,3,4,5,6 };int num = sizeof(arr) / sizeof(arr[0]);show_arr(arr, num);return 0;
}

 运行效果为:

在此代码中,我们使用数组的形式来接受数组,那么这两个数组是否相同???

我们可以通过测试数组的大小(sizeof 函数),来判定其是否相同,程序运行效果如下:

 从上述运行结果可知,两个数组的大小并不一样。通过调试监视,我们可以下图效果:

 我们可以看出 arr 的类型被降维成 int* 

那么如果在此处我们使用指针来接受数组,是否可以??? 代码如下:

#include<stdio.h>
void show_arr(int *arr, int num)
{printf("%d\n", sizeof(arr));int i = 0;for (i = 0; i < num; i++){printf("%d ", *(arr+i));}printf("\n");
}
int main()
{int arr[] = { 1,2,3,4,5,6 };int num = sizeof(arr) / sizeof(arr[0]);printf("%d\n", sizeof(arr));show_arr(arr, num);return 0;
}

程序运行成功后,效果为: 

 


由此,我们可以得出以下结论:

数组传参,需要降维成指针。


1.为什么需要降维???

如果不降维的话,就会发生数组拷贝(全拷贝),会导致函数调用的效率降低,所以需要降维成指针。

2.在函数调用时是否形成了临时拷贝???

我们可以通过数组首元素地址进行判断,若两者首元素地址相同,则说明没有形成临时拷贝,若两者首元素地址不相同,则说明形成了临时拷贝。


&arr[0] 与 &arr 的区别:

&arr[0] --- 取出的是首元素的地址,即数组内容第一个元素的地址

&arr --- 取出的数组的地址,即整个数组的地址


测试代码为:

#include<stdio.h>void show_arr(int arr[], int num)
{printf("%p\n",&arr);
}
int main()
{int arr[] = { 1,2,3,4,5,6 };int num = sizeof(arr) / sizeof(arr[0]);printf("%p\n", &arr);show_arr(arr, num);return 0;
}

 运行效果为:

 

 指针变量也是变量,在进行函数调用时,也要发生拷贝(拷贝指针)--- 调用函数形成临时拷贝。

•在C语言中,任何函数调用,只要有形参实例化,必定形成临时拷贝。

3.降维成什么指针???

 我们的示例举的都是一维数组的例子,在此处,我们举一个二维数组的列子:

 

由上述可知: 

所有的数组传参都会降维成指针,降维成为指向其(传入的数组)内部元素的指针。

C语言是面向过程语言,在进行数组传参的时候,为了效率,将其降维成指针。

4.C语言为什么要把指针和数组的访问设计成通用的???

如果指针和数组访问方式不统一,程序员需要不断地在不同的代码片段处,进行习惯的切换,本质上就会增加代码的出错率。

为了让程序员统一使用数组,并且减少出错的概率,数组和指针的访问方式设计成通用的。即,整个降维的过程,对用户是透明的。


 


http://www.ppmy.cn/news/241348.html

相关文章

洛谷P5638

不能排序。这里采用前缀和 #include<bits/stdc.h> using namespace std; int main(){long n,k;cin>>n>>k;vector<long long>arr(n-1);for(int i0;i<n-1;i){cin>>arr[i];if(i) arr[i]arr[i-1]; //计算前缀和}long long ansarr[n-2];if(k){for…

23、js - call()apply()bind()

<body><button>我是按钮</button> </body></html><script>// call apply bind 都可以改变this指向function fn(a, b) {const title ts;console.log(this);console.log(this.title);return a b;}const obj {title: vite}// 一、call()…

X11 转发

文章目录 参考参与者与凭据情景1 &#xff1a; 桌面终端下打开firefox情景2 &#xff1a; ssh 终端下打开firefox 情景1桌面终端下的 案例与DISPLAY 情景2基于X11转发的ssh案例ssh 终端下的 DISPLAY 情景2 下 vim 慢的问题 参考 什么是X11-forwarding&#xff1f;怎么使用&…

Springboot3 + SpringSecurity + JWT + OpenApi3 实现认证授权

Springboot3 SpringSecurity JWT OpenApi3 实现双token 目前全网最新的 Spring Security JWT 实现双 Token 的案例&#xff01;收藏就对了&#xff0c;欢迎各位看友学习参考。此项目由作者个人创作&#xff0c;可以供大家学习和项目实战使用&#xff0c;创作不易&#xff…

蓝桥 巧克力 贪心 排序 java

&#x1f351; 算法题解专栏 &#x1f351; 蓝桥 巧克力 输入 10 3 1 6 5 2 7 3 3 10 10输出 18&#x1f351; 思路 &#x1f364; 前边日期安排后影响后边的安排&#xff0c;但后边的安排不会影响前边的安排 &#x1f364; 从后往前步步贪心实现局部最优&#xff1a;在可选…

C语言,你觉得难吗?

C语言&#xff0c;众所周知&#xff0c;作为许多学校的编程入门课程&#xff0c;它并非易如反掌&#xff0c;甚至可称为最具挑战性的语言之一。学习C语言的难点不在于其语法&#xff0c;因为它的语法知识点并不繁多。其真正难以掌握之处在于如何运用这些简单的指令设计出复杂的…

企业课(理论)

数据链路层 IP地址&#xff1a;32bit 十进制、二进制表示 Mac地址&#xff1a;48bit 十六进制 &#xff08;0-9&#xff0c;a-f&#xff09; Mac地址&#xff1a; 单播Mac地址&#xff1a;一对一 48bit第八bit为0 组播Mac地址&#xff1a;一对多 48bit第八b…

iOS app上架截屏尺寸 5.5英寸:1242x2208 6.5英寸:1242x2688

5.5英寸和6.5英寸的iphone的截屏必须上传 5.5英寸&#xff1a;1242x2208 6.5英寸&#xff1a;1242x2688