前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针

作者头像
Qomolangma
发布2024-07-30 08:50:48
2540
发布2024-07-30 08:50:48
举报
文章被收录于专栏:C语言深度学习

前言

  • 指针是C语言中一个重要的概念
  • 正确灵活运用指针
    • 可有效地表示和使用复杂的数据结构
    • 可动态分配内存空间,节省程序运行空间,提高运行效率
  • 不正确理解和使用指针,指针将是程序中最危险的成分,由此带来的后果可能是无法估量的

七、指针

7.1 指针与变量

7.1.1 指针类型和指针变量

指针类型指定了指针所指向的变量的数据类型。例如,int*是指向整数(int)类型的指针。指针变量是一个存储了内存地址值的变量,可以使用指针变量来存储、操作和访问内存中的数据。

代码语言:javascript
复制
#include <stdio.h>

int main() {
    int num = 10; // 定义一个整数变量
    int* ptr; // 定义一个指向整数的指针变量

    ptr = &num; // 将指针指向num变量的地址

    printf("num 的值:%d\n", num);
    printf("指针所指向的变量的值:%d\n", *ptr);

    return 0;
}
  • C语言中的指针定义符是*,它用于声明一个指针变量。指针变量用来存储内存地址,可以指向其他变量或数据结构。例如,int *ptr;声明了一个指向整数的指针变量。
  • 间接引用运算符也称为解引用运算符,用于访问指针所指向的变量或数据。在C语言中,间接引用运算符使用*符号。通过将间接引用运算符应用于指针变量,可以获取该指针指向的实际值。例如,如果ptr是一个指向整数的指针变量,那么*ptr将给出该指针指向的整数的值。
7.1.2 指针所指变量

通过指针,我们可以访问指针所指向的变量。使用解引用运算符(*)可以获取指针所指向的变量的值。

代码语言:javascript
复制
#include <stdio.h>

int main() {
  int num = 10;
  int* ptr = &num;

  printf("通过指针访问变量的值:%d\n", *ptr);

  *ptr = 20; // 修改指针所指向的变量的值

  printf("修改后的变量的值:%d\n", num);

  return 0;
}
7.1.3 空指针、无效指针

空指针是指未指向任何有效地址的指针。在C语言中,可以使用NULL宏来表示空指针。

代码语言:javascript
复制
#include <stdio.h>

int main() {
  int* ptr = NULL; // 声明一个空指针

  if (ptr == NULL) {
    printf("指针是空指针\n");
  } else {
    printf("指针不是空指针\n");
  }

  return 0;
}

有时可能不小心生成无效指针 (Invalid Pointer)

无效指针是指一个指针变量无值,它既没有指向确定的变量或函数,也不是NULL。

程序中存在无效指针,不是好的程序设计风格

产生无效指针的原因很多,例如

说明指针变量后还没有给它赋值

指针被定义后,必须将指针和一个特定的变量进行关联后,才可以使用指针,即必须先赋值再使用

把整型变量转换成指针;

回收为指针所指对象分配存储空间;

代码语言:javascript
复制
float *p; 
p=(float *)malloc(sizeof(float));
……
free(p);

指针运算超出数组范围。

NULL是C指针类型的一个特殊值,在系统文件stdio.h中定义,其值为0,称为“空”

表示指针变量的值为空,不指向任何变量或函数

NULL值属于所有指针类型。判断指针变量iptr的值是否为空可以使用

代码语言:javascript
复制
iptr != NULL或iptr == NULL
iptr != 0

保证指针在没有指向有效对象时,取值为NULL是一种良好的编程风格

7.2 指针操作

指针操作是指对指针进行一些特定的运算或操作,用于操作指针所指向的内存位置。在C语言中,指针操作包括指针的算术运算、指针的比较和指针的递增/递减等。

7.2.1 指针的算术运算
  • 指针的加法运算:可以将指针与一个整数相加,结果是指针指向的内存地址增加了若干个字节。这对于遍历数组或访问连续内存块非常有用。
  • 指针的减法运算:可以将一个指针减去另一个指针,结果是两个指针之间的距离(以字节为单位)。
代码语言:javascript
复制
#include <stdio.h>

int main() {
  int arr[] = {1, 2, 3, 4, 5};
  int* ptr = arr;

  printf("第一个元素:%d\n", *ptr);

  // 指针加法运算
  ptr = ptr + 1;
  printf("第二个元素:%d\n", *ptr);

  // 指针减法运算
  ptr = ptr - 1;
  printf("回到第一个元素:%d\n", *ptr);

  return 0;
}
7.2.2 指针的比较

可以对两个指针进行比较运算,包括相等比较(==)、不等比较(!=)、大于比较(>)、小于比较(<)、大于等于比较(>=)和小于等于比较(<=)。

代码语言:javascript
复制
#include <stdio.h>

int main() {
  int arr[] = {1, 2, 3, 4, 5};
  int* ptr1 = &arr[0];
  int* ptr2 = &arr[2];

  if (ptr1 == ptr2) {
    printf("指针相等\n");
  } else {
    printf("指针不相等\n");
  }

  if (ptr1 < ptr2) {
    printf("ptr1 指向的元素在 ptr2 指向的元素之前\n");
  } else {
    printf("ptr1 指向的元素在 ptr2 指向的元素之后\n");
  }

  return 0;
}
7.2.3 指针的递增和递减

指针可以通过递增(++)和递减(--)运算符来移动到下一个或上一个内存位置,移动的距离取决于指针所指向的数据类型。

代码语言:javascript
复制
#include <stdio.h>

int main() {
  int arr[] = {1, 2, 3, 4, 5};
  int* ptr = arr;

  printf("第一个元素:%d\n", *ptr);

  // 指针递增
  ptr++;
  printf("下一个元素:%d\n", *ptr);

  // 指针递减
  ptr--;
  printf("回到第一个元素:%d\n", *ptr);

  return 0;
}

7.3 指向指针的指针

C语言支持指向指针的指针,也称为多级指针。指向指针的指针存储了一个指向指针变量的地址,通过多级指针可以访问多级间接引用的内存。

代码语言:javascript
复制
#include <stdio.h>

int main() {

  int num = 10;
  int* ptr = &num;
  int** ptr2 = &ptr;

  printf("num 的值:%d\n", num);
  printf("指针所指向的变量的值:%d\n", *ptr);
  printf("指向指针的指针所指向的变量的值:%d\n", **ptr2);

  return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 七、指针
    • 7.1 指针与变量
      • 7.1.1 指针类型和指针变量
      • 7.1.2 指针所指变量
      • 7.1.3 空指针、无效指针
    • 7.2 指针操作
      • 7.2.1 指针的算术运算
      • 7.2.2 指针的比较
      • 7.2.3 指针的递增和递减
    • 7.3 指向指针的指针
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档