我正在查看getline()
函数及其参数,这使我对如何使用&符号和取消引用星号“ *”感到困惑。
我知道“ *”用于声明指针,然后取消引用它,“&”用于引用变量的地址。但是,当您使用“&”来“解引用”类似于该行的指针时会发生什么:
characters = getline(&buffer,&bufsize,stdin);
从下面的代码?
是否获取了指针的地址?有点像使用双星号**吗?
这段代码来自: https://c-for-dummies.com/blog/?p=1112
#include <stdio.h>
#include <stdlib.h>
int input(char *s,int length);
int main()
{
char *buffer;
size_t bufsize = 32;
size_t characters;
buffer = (char *)malloc(bufsize * sizeof(char));
if( buffer == NULL)
{
perror("Unable to allocate buffer");
exit(1);
}
printf("Type something: ");
characters = getline(&buffer,&bufsize,stdin);
printf("%zu characters were read.\n",characters);
printf("You typed: '%s'\n",buffer);
return(0);
}
答案 0 :(得分:2)
&
是*
的倒数。
以char ch;
声明为例。它将ch
声明为一字节的整数变量。假设此变量恰好存储在0x80000000
。
您说ch = 65
时,就是要将位置0x80000000
的值更改为65
。
&
为您提供了存储变量的地址。因此&ch
是指针0x80000000
。 char *pointerToCh; pointerToCh = &ch
将因此导致pointerToCh
为0x80000000
*
引用指针地址处的值。因此,*pointerToCh
与ch
相同。 *pointerToCh = *pointerToCh + 7
将ch
更改为72
,因为它与ch = ch + 7
相同。还可以得出结论,*(&ch)
与ch
是同一件事。
存在一个问题,因为类型声明中也使用了*
,也就是说,某种东西是指针-如您在char *pointerToCh
中所见。这里的*
与*
中的*pointerToCh = *pointerToCh + 7
不同:第一个是指针类型;第一个是指针类型。第二个取消引用指针。
我们为什么要这样做?因为C语言中的函数只是复制传递给它们的参数,所以它们无法更改其参数,并且无法将此更改传播到调用代码。例如:
void uselesslyChange(char copyOfCh) {
// copyOfCh is 65
copyOfCh = 80;
// copyOfCh is 80
}
char ch = 65;
uselesslyChange(ch);
// ch is still 65
但是,如果我们知道地址,我们可以更改其中的地址(即使地址只是副本)。
void change(char* copyOfChPointer) {
// copyOfChPointer is 0x80000000, and there's a 65 there
*copyOfChPointer = 80;
// copyOfChPointer is 0x80000000, and there's a 80 there
}
char ch = 65;
change(&ch);
// ch is now 80
因此,您的代码。重要的一点是要了解getline
应该能够更改缓冲区(指向已分配内存区域的第一个字符的指针)和缓冲区大小(整数)以反映正在读取的行的大小(例如,如果缓冲区太小,getline
将在其他地方重新分配它)。为了能够更改它们,就像上面一样,它需要知道它们在内存中的位置。因此,getline
接受指向字符的指针(char **buffer
)和大小(size_t *bufsize
)的指针。请记住,这里的**
和*
是类型,而不是取消引用操作。