• 数组:数组是用于存储多个相同的数据类型的一片连续的内存空间,其数组名代表这段空间的首地址
  • 指针:指针也是一个变量,但是与别的变量不一样,它存放的是另一段内存的首地址

在这里我们需要注意数组名就是数组的首地址,而指针是存放的是地址,那就意味着在一些情况下指针和数组是可以替换使用的。但要注意的是,数组名永远都是指向这段内存空间的首地址,它是不能指向别的地址。如: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语言函数调用之数组与指针相关推荐

  1. c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc

    C语言的二数组的指针访问 二维数组的指针访问 --王炳华 指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点.如果真正弄懂了这个问题,就可以说你学会了使用指针. 二维数组的指针 指针就是地址 ...

  2. c语言二维数组 ppt,C语言二维数组与指针.ppt

    C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...

  3. c语言指针转换成数组,浅议C语言中灵魂数组和指针的互操作(转)

    浅议C语言中灵魂数组和指针的互操作(转)[@more@]曾听好多朋友说,C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减. 当然了,这是无可非议的,但是 ...

  4. C语言二维数组的指针写法

    C语言中二维数组要用Int** 来表示,在分配空间后,int**加一会移动到下一行.而m行n列的二维数组的寻址方式是首地址a+in+j,因此先对a+i找到相应的行,也就是一维数组,并且取得到一个int ...

  5. 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作

    文章目录 一.数组与指针 1.手搓冒泡排序(从大到小) 2.矩阵的转置和打印 3.判断矩阵是否对称 4.最大元素与最后元素互换(用指针) 5.首地址偏移法逆序排序 6.指针移动法逆序排序 7.用元素指 ...

  6. C语言 函数返回数组和指针区别

    1.示例代码 #include <stdio.h>char * str1() {char A[] = "Hello!";return A; } char * str2( ...

  7. C语言下标要求数组或指针,c语言改错 error C2109: 下标要求数组或指针类型怎么改?...

    /*魔方阵*/ #include int main() { int i,j,a,n; int arr[100][100]; printf("请输入n,n为100内奇数\n"); s ...

  8. C语言 多维数组和指针

    右图中圆圈代表指针,箭头代表它指向某个元素. 定义多维数组 int a[3][2]; 它的逻辑结构可以理解为右图. 图中上层数组存储的是3个指向二维数组的指针. 所以如果我们做如下操作: int *p ...

  9. C语言再学习 -- 数组和指针

    一.数组 1.数组介绍 数组(array)由一系列类型相同的元素构成.例如: int arr[10]; float candy[25]; char code[12]; 以上数组声明中包括数组元素的数目 ...

  10. c语言笔记之数组和指针(初学者)

    数组 定义 由数据类型相同的一系列元素组成 size_t arr[index]={ } *当{}内列出元素的值,可以让编译器自己数出数组大小,此时index可省略不写.数组的长度可以用(sizeof ...

最新文章

  1. GD32定时器输入捕获例程
  2. Oracle传输表空间
  3. Spark平台上提交作业到集群生成的日志文件
  4. K8S Learning(10)——Pod配置
  5. bind安装和主要配置
  6. python队列长度_[python模块]队列queue
  7. GridView中使用CheckBox
  8. git学习(九)跨团队协作-非团队成员参与git项目开发
  9. redhat7 上安装dummynet
  10. sql根据身份证号获取年龄和性别(Oracle+hive)
  11. 狗和猫有相同的情绪反应吗?
  12. 苹果手机软件闪退怎么解决_《NBA2K21》闪退怎么办 闪退异常问题解决方法
  13. 初识霍夫变换——霍夫变换直线检测原理(Line Detection)
  14. tecplot有效数字位数
  15. shell 字符串匹配
  16. GRU及双向RNN介绍
  17. 多表联查两张表中所取得字段相同怎么办?
  18. Selenium爬取MOOC网课程信息
  19. 巴菲特致股东的一封信:1983年
  20. 虹科方案 | 虹科Vdoo安全平台:CVE-2020-25860 - 在 RAUC 嵌入式固件更新框架中发现的重大漏洞

热门文章

  1. libsqlite3.dylib找不到
  2. The Beauty of DirectX 11 (3) --- constant buffer, buffered/structure buffer
  3. windows2003事件记录中显示组策略错误,登录域控制器很慢(服务器自身)
  4. vant上传图片组件怎么可以实现裁剪_开源小程序,练手必备,仿“美图秀秀”处理图片。...
  5. 语音推送提醒php,实时语音后台通知消息 - 百度免费的tts实现后台实时在线语音消息提醒 – 基于ThinkPHP和Bootstrap的极速后台开发框架...
  6. Keil5 解决编译通过显示红叉
  7. javafx 按钮中放置图片导致大小设置失效
  8. yagmail设置定时任务
  9. myeclipse与mysql连接_myeclipse 与 mysql 的连接
  10. C++中四种线程同步的方法