- 数组:数组是用于存储多个相同的数据类型的一片连续的内存空间,其数组名代表这段空间的首地址
- 指针:指针也是一个变量,但是与别的变量不一样,它存放的是另一段内存的首地址
在这里我们需要注意数组名就是数组的首地址,而指针是存放的是地址,那就意味着在一些情况下指针和数组是可以替换使用的。但要注意的是,数组名永远都是指向这段内存空间的首地址,它是不能指向别的地址。如: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
上面这段代码在编译运行的时候,我发现前面几个字节是对的,后面则是出现乱码,文件内容读的不全。这是因为 :
接下来,我们需改一下上面的代码来解决这个问题:
#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