📜  C指针

📅  最后修改于: 2020-10-04 12:23:22             🧑  作者: Mango

在本教程中,您将学习指针。什么是指针,如何使用它们以及在示例的帮助下使用它们时可能遇到的常见错误。

指针是C和C++编程的强大功能。在学习指针之前,让我们学习一下C编程中的地址。


C地址

如果程序中有变量var ,则&var将在内存中提供其地址。

在使用scanf() 函数时,我们已多次使用地址。

scanf("%d", &var);

在此,用户输入的值存储在var变量的地址中。让我们举一个可行的例子。

#include 
int main()
{
  int var = 5;
  printf("var: %d\n", var);

  // Notice the use of & before var
  printf("address of var: %p", &var);  
  return 0;
}

输出

var: 5 
address of var: 2686778

注意:运行上面的代码时,您可能会获得其他地址。


C指针

指针(指针变量)是用于存储地址而非值的特殊变量。

指针语法

这是我们如何声明指针的方法。

int* p;

在这里,我们声明了一个int类型的指针p

您也可以通过以下方式声明指针。

int *p1;
int * p2;

让我们再举一个声明指针的例子。

int* p1, p2;

在这里,我们声明了一个指针p1和一个普通变量p2


给指针分配地址

让我们举个例子。

int* pc, c;
c = 5;
pc = &c;

在此,将5分配给c变量。并且,将c的地址分配给pc指针。


获取指针所指事物的价值

为了获得指针所指向的事物的值,我们使用* 运算符。例如:

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc);   // Output: 5

在这里, c的地址被分配给pc指针。为了获得存储在该地址中的值,我们使用了* pc

注意:在上面的示例中, pc是一个指针,而不是*pc 。您不能也不应做类似*pc = &c ;的操作。

顺便说一下, *被称为解除引用运算符 (使用指针时)。它对指针进行操作,并给出存储在该指针中的值。


改变指针指向的价值

让我们举个例子。

int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c);    // Output: 1
printf("%d", *pc);  // Ouptut: 1

我们已经将c的地址分配给了pc指针。

然后,将c的值更改为1。由于pcc的地址相同,因此*pc给我们1。

让我们再举一个例子。

int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc);  // Ouptut: 1
printf("%d", c);    // Output: 1

我们已经将c的地址分配给了pc指针。

然后,我们使用*pc = 1;*pc更改*pc = 1; 。由于pcc的地址相同,因此c等于1。

让我们再举一个例子。

int* pc, c, d;
c = 5;
d = -15;

pc = &c; printf("%d", *pc); // Output: 5
pc = &d; printf("%d", *pc); // Ouptut: -15

最初,使用pc = &c;c的地址分配给pc指针pc = &c; 。由于c为5, *pc给我们5。

然后,使用pc = &d;d的地址分配给pc指针pc = &d; 。由于d为-15,因此*pc给我们-15。


示例:指针的工作

让我们举一个可行的例子。

#include 
int main()
{
   int* pc, c;
   
   c = 22;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c);  // 22
   
   pc = &c;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 22
   
   c = 11;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 11
   
   *pc = 2;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c); // 2
   return 0;
}

输出

Address of c: 2686784
Value of c: 22

Address of pointer pc: 2686784
Content of pointer pc: 22

Address of pointer pc: 2686784
Content of pointer pc: 11

Address of c: 2686784
Value of c: 2

程序说明

  1. int* pc, c;
    将创建一个指针变量和一个普通变量。
    在这里,创建了一个指针pc和一个类型为int的普通变量c
    由于pcc最初并未初始化,因此指针pc指向无地址或随机地址。并且,变量c有一个地址,但包含随机垃圾值。
  2. c = 22;
    22被分配给变量c。
    这将22分配给变量c 。也就是说,将22存储在变量c的存储位置中。
  3. pc = &c;
    变量c的地址分配给指针pc。
    这将变量c的地址分配给指针pc
  4. c = 11;
    11分配给变量c。
    这将11分配给变量c
  5. *pc = 2;
    5分配给指针变量的地址。
    会将指针pc指向的内存位置的值更改为2。

使用指针时的常见错误

假设您希望指针pc指向c的地址。然后,

int c, *pc;

// pc is address but c is not
pc = c; // Error

// &c is address but *pc is not
*pc = &c; // Error

// both &c and pc are addresses
pc = &c;

// both c and *pc values 
*pc = c;

这是指针语法初学者经常会感到困惑的示例。

#include 
int main() {
   int c = 5;
   int *p = &c;

   printf("%d", *p);  // 5
   return 0; 
}

当使用int *p = &c;时为什么没有得到错误int *p = &c;

这是因为

int *p = &c;

相当于

int *p:
p = &c;

在这两种情况下,我们都将创建一个指针p (不是*p )并将&c分配给它。

为了避免这种混乱,我们可以使用如下语句:

int* p = &c;

现在您知道了什么是指针,您将在下一个教程中学习指针与数组的关系。