详解C语言学习记录之指针

详解C语言学习记录之指针攻略

一、指针的定义及基本操作

  1. 指针的定义:指针是一个变量,其值为另一个变量的地址。即:“指向”另一个变量的变量。

指针的定义格式为:

    data_type *pointer_name;

其中,data_type 表示指针变量所指向的数据类型;pointer_name 为指针变量的名字。

例如:

    int a;   // 定义一个int类型的变量a
    int *p;  // 定义一个指向int类型变量的指针变量p
    p = &a;  // 取a的地址赋值给p
  1. 指针的基本操作:取址、取值、指针运算、指针比较

  2. 取址操作:使用 & 运算符获取变量的内存地址,例如:

    int a;
    int *p;
    p = &a;  // 取a的地址赋值给p
  • 取值操作:使用 * 运算符获取指针指向的变量的值,例如:
    int a = 100;
    int *p;
    p = &a;
    printf("%d", *p);  // 输出a的值100
  • 指针运算:指针可以进行加、减运算,例如:
   int a[5] = {1, 2, 3, 4, 5};
   int *p = a;  // 指针p指向数组第一个元素的地址
   printf("%d\n", *(p + 2));  // 输出第3个元素的值3
  • 指针比较:可以使用比较运算符 <、>、==、!=、<=、>= 比较两个指针的大小,例如:
    int a[5] = {1, 2, 3, 4, 5};
    int *p1 = &a[2];
    int *p2 = &a[4];
    printf("%d\n", p1 < p2);  // 输出1,即p1的地址小于p2的地址

二、指针与数组的关系

  1. 数组名与指针名的关系

数组名的本质是数组第一个元素的指针,可以通过数组名来获取其指向的第一个元素的地址,并可以通过指针名来操作数组元素,例如:

    int a[5] = {1, 2, 3, 4, 5};
    int *p = a;  // 指针p指向数组第一个元素的地址
    printf("%d\n", *p);  // 输出数组第一个元素的值1
    printf("%d\n", *(a+1));  // 输出数组第二个元素的值2
  1. 数组与指针的区别

数组是由一组相同类型的数据元素构成的集合,其大小固定;而指针则是变量的地址,在程序运行时可以动态地指向不同的变量,其大小不固定。

三、指针与函数参数

  1. 传递指针参数

在 C 语言中,函数参数是通过值传递的,即函数参数接收的是实参的值的拷贝。当需要在函数内部修改实参的值时,可以将实参的地址传递给函数,即传递指针参数。例如:

    void swap(int *a, int *b) {
        int temp;
        temp = *a;
        *a = *b;
        *b = temp;
    }

    int main() {
        int x = 2, y = 3;
        swap(&x, &y);
        printf("x = %d, y = %d", x, y);  // 输出x = 3, y = 2
        return 0;
    }
  1. 函数返回指针

在 C 语言中,函数可以返回指针,用于指向函数内部定义的变量或动态分配的内存空间。例如:

    int *get_number() {
        int *p = (int *)malloc(sizeof(int));  // 动态分配内存
        *p = 100;
        return p;  // 返回指向动态分配内存空间的指针
    }

    int main() {
        int *p;
        p = get_number();
        printf("%d", *p);  // 输出100
        free(p);  // 释放动态分配的内存
        return 0;
    }

四、指向数组的指针

可以定义指向数组的指针,例如:

    int a[5] = {1, 2, 3, 4, 5};
    int *p = a;  // 指针p指向数组第一个元素的地址
    for (int i = 0; i < 5; i++) {
        printf("%d ", *(p + i));  // 依次输出数组a的元素值
    }

五、示例说明

  1. 指针变量的使用示例
    int main() {
        int a = 1, b = 2, c = 3;
        int *p1, *p2, *p3;  // 定义三个指向int类型变量的指针
        p1 = &a;  // 取a的地址赋值给p1
        p2 = &b;  // 取b的地址赋值给p2
        p3 = &c;  // 取c的地址赋值给p3
        *p1 = 10;  // 修改*p1所指向的变量的值
        *p2 = *p1 + *p3;  // 修改*p2所指向的变量的值
        p3 = p1;  // 修改p3的指向,使其指向p1所指向的地址
        printf("a = %d, b = %d, c = %d", a, b, c);  // 输出a = 10, b = 13, c = 3
        return 0;
    }
  1. 函数传递指针参数的示例
     void bubble_sort(int *a, int n) {
        for (int i = n - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (*(a + j) > *(a + j + 1)) {
                    int temp = *(a + j);
                    *(a + j) = *(a + j + 1);
                    *(a + j + 1) = temp;
                }
            }
        }
    }

    int main() {
        int a[5] = {5, 4, 3, 2, 1};
        bubble_sort(a, 5);  // 传递数组a的地址和长度5
        for (int i = 0; i < 5; i++) {
            printf("%d ", *(a + i));
        }
        return 0;
    }

以上是针对C语言中指针的详解攻略,详细讲解指针的定义、基本操作、与数组关系、函数参数、以及指向数组的指针,并给出了两个示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C语言学习记录之指针 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C++ 中”priority_queue” 优先级队列实例详解

    C++ 中 “priority_queue” 优先级队列实例详解 1. 什么是优先级队列(Priority Queue)? 优先级队列是一种特殊的队列,它的元素按照一定的优先级进行排序和访问。在 C++ 中,我们可以使用 priority_queue 类来实现优先级队列。 2. priority_queue 类的基本用法 priority_queue 类定义…

    other 2023年6月28日
    00
  • iscroll.js滚动加载实例详解

    iScroll.js滚动加载实例详解 介绍 iScroll.js是一款移动端滚动插件,可以实现移动端的滚动效果和滚动加载等功能。本文将详细介绍使用iScroll.js实现滚动加载的方案。 iScroll.js iScroll.js是一款专门为移动端开发的滚动插件,它可以实现各种滚动效果、滚动加载,同时支持多种设备和浏览器。 滚动加载 滚动加载就是一种页面加载…

    other 2023年6月25日
    00
  • python+selenium练习篇之10-刷新当前页面

    Python+Selenium练习篇之10-刷新当前页面 在使用Selenium进行自动化测试时,有时需要刷新当前页面。本文将介绍如何使用Python和Selenium刷新当前页面,并提供两个示例说明。 方法1:使用driver.refresh()方法 Selenium提供了driver.refresh()方法,可以刷新当前页面。以下是使用driver.re…

    other 2023年5月8日
    00
  • 利用uni-app开发App的超简易教程

    下面我将详细讲解如何利用uni-app开发App的超简易教程。 1. 准备工作 首先,我们需要准备好开发环境。具体步骤如下: 安装 Node.js:前往官网 https://nodejs.org/en/ 下载并安装 Node.js。 安装 HBuilderX:前往官网 https://www.dcloud.io/hbuilderx.html 下载并安装 HB…

    other 2023年6月26日
    00
  • Jquery实现图片预加载与延时加载的方法

    以下是详细讲解 “JQuery实现图片预加载与延迟加载的方法”的完整攻略: 什么是图片预加载? 图片预加载是在网页加载时提前把所需的图片加载进缓存,从而提高用户访问网页时的速度体验。而不是等到需要显示出来的时候再去加载,造成用户等待时间过长。 JQuery实现图片预加载的方法 实现图片预加载的方法一般有两种方式: 1. 利用JQuery的ajax请求 可以用…

    other 2023年6月25日
    00
  • android studio logcat 无筛选 显示全部日志 无应用包名区分方式

    Android Studio Logcat 无筛选 显示全部日志 无应用包名区分方式攻略 在Android Studio中,Logcat是一个非常有用的工具,用于查看应用程序的日志输出。默认情况下,Logcat会显示所有应用程序的日志,但有时我们可能需要筛选特定应用程序的日志,或者只显示特定级别的日志。本攻略将详细介绍如何在Android Studio中实现…

    other 2023年9月7日
    00
  • SQL实现递归及存储过程中In()参数传递解决方案详解

    下面我将为你详细讲解“SQL实现递归及存储过程中In()参数传递解决方案详解”的完整攻略。 SQL实现递归 什么是递归 递归(Recursion)指的是在函数内部调用函数本身的方法。在SQL中,递归主要使用WITH RECURSIVE语句来实现。 WITH RECURSIVE语句 WITH RECURSIVE语句是递归查询的核心语句,它的语法如下: WITH…

    other 2023年6月27日
    00
  • Shell脚本创建指定大小文件的测试数据

    Shell脚本创建指定大小文件的测试数据攻略 有时候我们需要创建一些指定大小的测试数据文件,以便进行性能测试或其他目的。下面是使用Shell脚本创建指定大小文件的详细攻略: 确定文件大小:首先,确定您想要创建的文件的大小。可以使用以下命令将文件大小转换为字节: bash size_in_bytes=$((desired_size * 1024 * 1024)…

    other 2023年10月18日
    00
合作推广
合作推广
分享本页
返回顶部