C语言函数调用之数组与指针

C语言函数调用之数组与指针,第1张

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

在这里我们需要注意数组名就是数组的首地址,而指针是存放的是地址,那就意味着在一些情况下指针和数组是可以替换使用的。


但要注意的是,数组名永远都是指向这段内存空间的首地址,它是不能指向别的地址。


如: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 
#include 
#include 
#include 
#include 
#include 

#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 
#include 
#include 
#include 
#include 
#include 

#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 

#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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/564166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-03
下一篇 2022-04-03

发表评论

登录后才能评论

评论列表(0条)

保存