C 如何及;a是指向a的指针,如果它生成a的地址?

C 如何及;a是指向a的指针,如果它生成a的地址?,c,pointers,memory-address,C,Pointers,Memory Address,我是编程新手,目前正在学习C语言中的指针 我知道指针是包含或保存另一个变量地址的变量。今天,当我通过K&R进一步了解它时,我在第80页的给定函数交换(&a,&b)中有一行写着“&a是指向a的指针”,对此我感到困惑。指针是什么&a?它不是一个变量,而是变量的地址。我说得对吗 我知道参数可以通过两种方式传递给函数:按值调用和按引用调用。调用方的参数值在第一个参数中没有更改,但在第二个参数中可以更改 我的问题是,我已经读到,如果我们想要更改变量的值,我们必须将指针传递给它(即,我们想要修改的值的位置)

我是编程新手,目前正在学习C语言中的指针

  • 我知道指针是包含或保存另一个变量地址的变量。今天,当我通过K&R进一步了解它时,我在第80页的给定函数交换(&a,&b)中有一行写着“&a是指向a的指针”,对此我感到困惑。指针是什么&a?它不是一个变量,而是变量的地址。我说得对吗
  • 我知道参数可以通过两种方式传递给函数:按值调用和按引用调用。调用方的参数值在第一个参数中没有更改,但在第二个参数中可以更改
  • 我的问题是,我已经读到,如果我们想要更改变量的值,我们必须将指针传递给它(即,我们想要修改的值的位置)。这是什么意思?我是说,我们必须传递指向函数的指针吗?“我们必须将指针传递到我们要修改的位置”这句话的含义是什么

    C中的指针地址是同义词

    创建变量时:

    int a = 0; 
    
    它是在特定内存位置或地址的内存中创建的,具有足够的内存来容纳1
    int

    &a不生成地址,它只提供地址

    &
    运算符可用于设置指向特定位置的指针地址,例如:

    int a = 0;//a now exists in memory at a specific location;
    int *b = {0}; // b is created in memory as a pointer, and can be assigned a location
    
    b = &a; //b is assigned the location (address) of the variable a  
    
    稍微不同的是,在前一行中,
    &
    被称为运算符的地址,因此:

    b=&x可读取:将a的地址分配给b(指针)

  • 指针包含地址-因此同义
  • 当您通过引用传递时,您正在传递地址-以直接修改值 指针不是变量。指针是一个值

    在C中,一个变量指定一个存储位置,并且一个值可以存储在该位置。因此,如果使用
    int a
    声明变量
    a
    ,则
    a
    是一个可以存储整数值的变量。如果您有一个变量
    int*x
    ,则
    x
    是一个可以存储指向整数值的指针的变量

    可以使用
    运算符获取存储位置的地址。例如,
    &a
    是由
    a
    指定的存储位置的地址,或者
    a
    的地址,并且可以存储在(除其他外)相应类型的变量中。因此,您可以:

    int  a = 42;  /* a is a variable of type int,  and has value 42 */
    int* x = &a;  /* x is a variable of type int*, and has value &a */
    
    尽管编程中的类比通常是危险的,但您可能会想到书中的页码之类的事情。页面的页码与页面的页码不同,但页码仍然可以写在页面上。例如,目录页上写有许多页码。因此:

    actual_page p = ...; /* a page structure */
    page_number n = &p;  /* a page number    */
    

    指针是一种存储对象地址的变量类型

    基本上,指针就是地址

    把它想象成一张纸。当它上面打印了一个数字时,它是一个
    整数
    (或其他数字类型)。

    指针是一张纸,上面写着“数据在位置x的纸上”,其中“位置x”是对象的地址。

    如果
    A
    是某种类型的变量
    T
    ,则
    &A
    是计算该变量地址的表达式,这些术语也称为指向该变量的指针,可以互换
    &a
    的类型为
    T*
    ,读作“指向
    T
    ”的指针

    int x = 4;   // 4 has type int, so we can assign it to an int variable.
    int *p = &x; // &x has type int*, so we can assign it to an int* variable.
    
    您可以修改指针传递的函数参数的原因是指针为变量引入了一种别名。您可以从多个位置直接(通过变量)或间接(通过指针)更改它


    正如其他人所观察到的,指针是一种特殊的值,而不是一种特殊的变量

    关于呼叫功能:

  • 在C语言中不能“将变量传递给函数”。如果在函数调用的参数列表中放入变量名,则传递存储在该变量中的值,而不是传递变量本身

  • 虽然在一般意义上,编程语言可以提供通过值或引用传递函数参数,但C只提供通过值传递的函数参数。但是,您可以通过将指针(值)传递到存储另一个值的位置来模拟C中的按引用传递。这就是
    swap(&a,&b)
    所做的:传递变量
    a
    b
    的值存储的位置(即指向这些值的指针)

  • 指针是地址。指针变量是保存地址的变量

    它可能类似于文本整数
    1
    和整数变量
    inta
    之间的差异。可以将
    a
    1
    都称为整数,就像您可以将
    &a
    int*p
    称为指针一样


    还要注意的是,
    &a
    不是左值,不能赋值——正如您所说,它不是变量,但它仍然是指针,本身可以赋值给指针变量。

    有些人用“指针”表示“指针变量”。特别是,“指针是变量”只有在使用“指针”作为“指针变量”的缩写时才为真。任何表达式都可以是指针类型
    &a
    是一个表达式(它有一个指针类型)。从技术上讲,传递指针不是通过引用传递。@ScottHunter:前面,OP正确地提到了括号中的
    地址,比如指针(地址)。不知道,这种混乱是怎么来的。我只是因为这个原因才投了赞成票
    
    // modifying x modifies *p.
    ++x;
    printf("%d %d\n", x, *p);
    
    // modifying *p modifies x.
    ++*p;
    printf("%d %d\n", x, *p);