当前位置:网站首页>【C语言】关于数组传参问题/首地址
【C语言】关于数组传参问题/首地址
2022-08-03 05:25:00 【EurekaO-O】
数组在作为参数传递时,传递的是整个数组还是首地址呢?
先来看一段代码:
void main() {
int nums[] = { 1,2,3,4,5 };
printf("&nums = %p\n", &nums);
printf("&nums = %p\n", &nums+1);
putchar('\n');
printf("nums = %p\n", nums);
printf("nums[0] = %p\n", &nums[0]);
printf("nums[1] = %p\n", &nums[1]);
}
运行结果:
从运行结果可以看到,nums的地址和nums[0]的地址是相同的,也就是说nums存储的其实是数组第一个元素的地址。数组名其实是个指针变量,值就是第一个元素的地址。类型取决于数组元素的类型。
注:&nums取出的值其实是整个数组的地址,从运行结果可以看出来,虽然nums和&nums取出来的地址相同,但本质上是不相同的,可以看&nums+1和&nums[1]的地址对比。
现在了解了数组地址后,再回到上面的问题:数组在作为参数传递的时候是否传递的也是首地址呢?
再来看下面这段代码:
void test1(int nums[]) {
printf("nums = %p\n",nums);
printf("nums[0] = %p\n",&nums[0]);
printf("nums[1] = %p\n",&nums[1]);
}
void test2(int * nums) {
printf("nums = %p\n", nums);
printf("nums[0] = %p\n", &nums[0]);
printf("nums[1] = %p\n", &nums[1]);
}
void main() {
int nums[] = {1,2,3,4,5};
test1(nums);
putchar('\n');
test2(nums);
}
运行结果:
可以看到其实test1和test2执行结果相同,传递的都是首地址,也证明了数组名其实是一个指针变量。
注意:当使用sizeof运算符和单目运算符&时例外
1.sizeof表示取出整个数组的大小
2.&nums取出的地址是整个数组地址(不是首元素地址)
关于数组传参问题/首地址到这里就结束了,如果您有什么其他补充的或其他想法的可以留在评论区~
第一次学C语言如果有不好的地方请留在评论区或私信我也可以,以后有空的话也会经常发博客。谢谢支持!~
边栏推荐
- Windos 内网渗透之Token的使用
- IPC 通信 - IPC
- NIO知识汇总 收藏这一篇就够了!!!
- 虚拟地址空间布局
- 自监督论文阅读笔记 DenseCL:Dense Contrastive Learning for Self-Supervised Visual Pre-Training
- 全球一流医疗技术公司如何最大程度提高设计工作效率 | SOLIDWORKS 产品探索
- MATLAB自带的dwt2和wavedec2函数实现基于小波变换的自适应阈值图像边缘检测
- MATLAB给多组条形图添加误差棒
- 自监督论文阅读笔记 Multi-motion and Appearance Self-Supervised Moving Object Detection
- g++ parameter description
猜你喜欢
随机推荐
网络间通信
KASLR-内核地址空间布局随机化
JS--正则表达式
window下VS2022封装动态库以及调用动态库
数组与字符串14-使用双指针移除元素
enum和enum class的区别
二分查找6 - 寻找峰值
cb板上常用的电子元器件都有哪些?
ZEMAX | 在设计抬头显示器(HUD)时需要使用哪些工具?
Practice of MySql's Sql statement (try how many you can write)
在大程序中怎么样显示LED点阵
memblock
pandoc -crossref插件实现markdwon文档转word后公式编号自定义
剑指 Offer II 001. 整数除法
ZEMAX | 如何创建简单的非序列系统
MATLAB给多组条形图添加误差棒
三分钟看懂二极管的所有基础知识点
IPC通信 - 管道
ZEMAX | 在OpticStudio中建立扩增实境(VR)头戴式显示器
电子元器件和电子元件的区别有那些?