考虑到这个声明:
int 数组[] = ....;
我知道&array[0]将第一个元素的地址作为其值。
但是&array呢?我在我的程序中尝试了这个,它还返回了第一个元素的地址。那么有什么区别呢?
我正在学习 C 中的指针和数组,这是一个让我困惑了一段时间的问题:
因此,一维 int 数组的名称是指向int的常量指针,它指向该数组中的第一个元素。因此,当我们评估一维数组的名称时,我们应该获取数组中第一个元素的地址。
对于二维 int 数组,数组名称是指向int的第一个数组的指针。那么 2D int 数组名称的值是什么?我认为它应该是这个二维数组中第一个数组的地址。但是C中数组的地址是如何定义的呢?它只是该数组中第一个元素的地址吗?
假设k是指向C中的整数的指针.
对于表达式**k,当我们尝试在赋值运算符("=")的右侧对此进行求值时,该值是否非法?
这是我的想法:
**k实际上是*(*k).当我们取消引用k时,我们得到一个整数的值.然后我们尝试取消引用一个整数,这是一个非法的操作.
但是我的教科书说右边的这个表达实际上是合法的.
为什么这样?
我尝试使用系统调用 lseek() 来返回文件的开头或到达文件的结尾。
我使用的确切代码是:
int location = lseek(fd, 0, SEEK_SET) //get back to the beginning
int location = lseek(fd, 0, SEEK_END) //reach to the end
Run Code Online (Sandbox Code Playgroud)
但是,在重置文件位置后,每当我尝试使用 read() 时,read() 的返回值总是设置为 -1,这意味着出现了问题。此外,我收到的 errno 消息是错误的文件描述符。有谁知道我应该做什么?
PS:我尝试关闭并重新打开文件以帮助我回到文件的开头,并且它有效。但我不知道如何在不使用 lseek() 的情况下到达文件末尾并以相反的顺序读取整个文件。
另外:一个可重现的例子是:
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
int fd;
char buffer[1000];
fd = creat("newFile", 0777);
memset(buffer, 'a', 500);
write(fd, buffer, 500); // fill up
int location = lseek(fd, 0, SEEK_SET); //get back to the beginning
int read_bytes = read(fd, buffer, …Run Code Online (Sandbox Code Playgroud)