可以交替使用&和*进行解引用吗?

时间:2019-02-08 01:55:57

标签: c

我正在查看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);
}

1 个答案:

答案 0 :(得分:2)

C中的

&*的倒数。

char ch;声明为例。它将ch声明为一字节的整数变量。假设此变量恰好存储在0x80000000

您说ch = 65时,就是要将位置0x80000000的值更改为65

&为您提供了存储变量的地址。因此&ch是指针0x80000000char *pointerToCh; pointerToCh = &ch将因此导致pointerToCh0x80000000

*引用指针地址处的值。因此,*pointerToChch相同。 *pointerToCh = *pointerToCh + 7ch更改为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)的指针。请记住,这里的***类型,而不是取消引用操作。

相关问题