C语言函数调用之数组与指针
- 数组:数组是用于存储多个相同的数据类型的一片连续的内存空间,其数组名代表这段空间的首地址
- 指针:指针也是一个变量,但是与别的变量不一样,它存放的是另一段内存的首地址
在这里我们需要注意数组名就是数组的首地址,而指针是存放的是地址,那就意味着在一些情况下指针和数组是可以替换使用的。但要注意的是,数组名永远都是指向这段内存空间的首地址,它是不能指向别的地址。如:int array[3] 中的array可以看作是int *const array类型的指针。既然说数组名就是数组的首地址,那么数组在传地址的时候,数组名前无需加&(取地址符)。
另外,指针是用来存放地址的,且指针的大小只与系统的位数有关。在64位系统中,指针的大小是8位;而32位系统中指针的大小是4位。我们可以使用sizeof(指针名)来查看。
数组的大小是其占用的地址空间的大小,与其类型相关,也可以通过sizeof(数组名)查看。
下面这段代码,我们希望从文件(rpi1.txt)从读取数据,并把数据放到main()函数定义的rpi_id中。
rpi1.txt文件内容如下:
RPI0001
本段代码在32位的树莓派上运行。iot12@raspberrypi:~/lyt/apue $ vim test.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>#define PATH "rpi1.txt"int get_id(char *rpi_id);
int main(int argc, char **argv)
{char rpi_id[16];get_id(rpi_id);printf("%s\n", rpi_id);return 0;}int get_id(char *rpi_id)
{int fd = -1;fd = open(PATH, O_RDONLY);memset(rpi_id, 0, sizeof(rpi_id));read(fd, rpi_id, sizeof(rpi_id));close(fd);return 0;
}
iot12@raspberrypi:~/lyt/apue $ gcc test.c -o test
iot12@raspberrypi:~/lyt/apue $ ./test
RPI0:V
上面这段代码在编译运行的时候,我发现前面几个字节是对的,后面则是出现乱码,文件内容读的不全。这是因为 :
- 在函数调用中,我想要传的是一个数组,但在被调函数中其并不代表是数组,因为在被调函数中rpi_id被定义成一个指针,所以在sizeof(rpi_id)的时候其大小是指针的大小而不是数组的大小。因为这里使用的是32位的系统,所以只能正确读取4位。
- 注意,函数调用的时候我们只能将指针的首地址传过去,而不可以将数组的大小传过去。所以,如果我们希望用指针来表示一段内存空间的话,还需要另外一个参数来传递这段空间的大小。
接下来,我们需改一下上面的代码来解决这个问题:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>#define PATH "rpi1.txt"int get_id(char *rpi_id, int size);
int main(int argc, char **argv)
{char rpi_id[16];get_id(rpi_id, sizeof(rpi_id));printf("%s\n", rpi_id);return 0;}int get_id(char *rpi_id, int size)
{int fd = -1;fd = open(PATH, O_RDONLY);memset(rpi_id, 0, size);read(fd, rpi_id, size);close(fd);return 0;
}
iot12@raspberrypi:~/lyt/apue $ gcc test.c -o test
iot12@raspberrypi:~/lyt/apue $ ./test
RPI0001
从运行结果我们可以看到,现在成功的获取文件中的数据了。
有些时候,我们可能想要传的是数组的个数,而不是数组所占用的内存空间。这时候我们可以定义一个宏先获取数组的个数,这样在函数中就可以很方便获取数组的个数。那么在函数调用的时候,我们还是可以通过传一个参数表示数组的个数。下面我们用这段代码来实现:
iot12@raspberrypi:~/lyt/apue $ vim test.c
#include <stdio.h>#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))int get_id(char *rpi_id, int sum);
int main(int argc, char **argv)
{char rpi_id[16];get_id(rpi_id, ARRAY_SIZE(rpi_id));return 0;
}int get_id(char *rpi_id, int sum)
{printf("Array item size:%d\n", sum);
}
iot12@raspberrypi:~/lyt/apue $ gcc test.c -o test
iot12@raspberrypi:~/lyt/apue $ ./test
Array item size:16
C语言函数调用之数组与指针相关推荐
- c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc
C语言的二数组的指针访问 二维数组的指针访问 --王炳华 指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点.如果真正弄懂了这个问题,就可以说你学会了使用指针. 二维数组的指针 指针就是地址 ...
- c语言二维数组 ppt,C语言二维数组与指针.ppt
C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...
- c语言指针转换成数组,浅议C语言中灵魂数组和指针的互操作(转)
浅议C语言中灵魂数组和指针的互操作(转)[@more@]曾听好多朋友说,C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减. 当然了,这是无可非议的,但是 ...
- C语言二维数组的指针写法
C语言中二维数组要用Int** 来表示,在分配空间后,int**加一会移动到下一行.而m行n列的二维数组的寻址方式是首地址a+in+j,因此先对a+i找到相应的行,也就是一维数组,并且取得到一个int ...
- 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作
文章目录 一.数组与指针 1.手搓冒泡排序(从大到小) 2.矩阵的转置和打印 3.判断矩阵是否对称 4.最大元素与最后元素互换(用指针) 5.首地址偏移法逆序排序 6.指针移动法逆序排序 7.用元素指 ...
- C语言 函数返回数组和指针区别
1.示例代码 #include <stdio.h>char * str1() {char A[] = "Hello!";return A; } char * str2( ...
- C语言下标要求数组或指针,c语言改错 error C2109: 下标要求数组或指针类型怎么改?...
/*魔方阵*/ #include int main() { int i,j,a,n; int arr[100][100]; printf("请输入n,n为100内奇数\n"); s ...
- C语言 多维数组和指针
右图中圆圈代表指针,箭头代表它指向某个元素. 定义多维数组 int a[3][2]; 它的逻辑结构可以理解为右图. 图中上层数组存储的是3个指向二维数组的指针. 所以如果我们做如下操作: int *p ...
- C语言再学习 -- 数组和指针
一.数组 1.数组介绍 数组(array)由一系列类型相同的元素构成.例如: int arr[10]; float candy[25]; char code[12]; 以上数组声明中包括数组元素的数目 ...
- c语言笔记之数组和指针(初学者)
数组 定义 由数据类型相同的一系列元素组成 size_t arr[index]={ } *当{}内列出元素的值,可以让编译器自己数出数组大小,此时index可省略不写.数组的长度可以用(sizeof ...
最新文章
- GD32定时器输入捕获例程
- Oracle传输表空间
- Spark平台上提交作业到集群生成的日志文件
- K8S Learning(10)——Pod配置
- bind安装和主要配置
- python队列长度_[python模块]队列queue
- GridView中使用CheckBox
- git学习(九)跨团队协作-非团队成员参与git项目开发
- redhat7 上安装dummynet
- sql根据身份证号获取年龄和性别(Oracle+hive)
- 狗和猫有相同的情绪反应吗?
- 苹果手机软件闪退怎么解决_《NBA2K21》闪退怎么办 闪退异常问题解决方法
- 初识霍夫变换——霍夫变换直线检测原理(Line Detection)
- tecplot有效数字位数
- shell 字符串匹配
- GRU及双向RNN介绍
- 多表联查两张表中所取得字段相同怎么办?
- Selenium爬取MOOC网课程信息
- 巴菲特致股东的一封信:1983年
- 虹科方案 | 虹科Vdoo安全平台:CVE-2020-25860 - 在 RAUC 嵌入式固件更新框架中发现的重大漏洞
热门文章
- libsqlite3.dylib找不到
- The Beauty of DirectX 11 (3) --- constant buffer, buffered/structure buffer
- windows2003事件记录中显示组策略错误,登录域控制器很慢(服务器自身)
- vant上传图片组件怎么可以实现裁剪_开源小程序,练手必备,仿“美图秀秀”处理图片。...
- 语音推送提醒php,实时语音后台通知消息 - 百度免费的tts实现后台实时在线语音消息提醒 – 基于ThinkPHP和Bootstrap的极速后台开发框架...
- Keil5 解决编译通过显示红叉
- javafx 按钮中放置图片导致大小设置失效
- yagmail设置定时任务
- myeclipse与mysql连接_myeclipse 与 mysql 的连接
- C++中四种线程同步的方法