亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C 指针

C 指针

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

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


C 中的地址

如果你有一个变量 var 在你的程序中,&var 会给你它在内存中的地址。

我们在使用 scanf() 时多次使用地址 功能。

scanf("%d", &var);

这里,用户输入的值存放在var的地址中 多变的。让我们举一个实际的例子。

#include <stdio.h>
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;

在这里,我们声明了一个指针 p int 输入。

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

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. 由于 pc 以及 c 的地址 一样,*pc 给我们1。

我们再举一个例子。

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

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

然后,我们更改了 *pc 使用 *pc = 1; 为 1 .由于 pc 以及 c 的地址 是一样的,c 将等于 1。

我们再举一个例子。

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

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

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

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


示例:指针的工作

让我们举一个实际的例子。

#include <stdio.h>
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 和一个普通变量 c , 均为 int 类型 , 被建造。
    由于 pcc 最初没有初始化,指针 pc 指向无地址或随机地址。并且,变量 c 有一个地址但包含随机垃圾值。
  2. c = 22;

    这将 22 分配给变量 c .即22存放在变量c的内存位置 .
  3. pc = &c;

    这分配了变量 c 的地址 指向指针 pc .
  4. c = 11;

    这将 11 分配给变量 c .
  5. *pc = 2;

    这会改变指针 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;  // Not an error

// both c and *pc values 
*pc = c;  // Not an error

这是一个指针语法的例子,初学者经常会感到困惑。

#include <stdio.h>
int main() {
   int c = 5;
   int *p = &c;

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

为什么我们在使用 int *p = &c; 时没有报错 ?

这是因为

int *p = &c;

相当于

int *p:
p = &c;

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

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

int* p = &c;

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


C语言

  1. C# Hello World - 你的第一个 C# 程序
  2. C# 关键字和标识符
  3. C# 变量和(原始)数据类型
  4. C# 运算符
  5. C# 位和位移运算符
  6. C# 基本输入和输出
  7. C# 表达式、语句和块(附示例)
  8. C# 注释
  9. C 指针
  10. 数组和指针的关系
  11. C 传递地址和指针
  12. C 结构体和指针