C语言中指针的进阶概念及应用

概念

指针是C语言编程中最强大的特性之一。除了基础的指针概念外,理解指针数组、指向指针的指针(双重指针)、指针与多维数组的关系以及函数指针等进阶概念,对于深入理解C语言至关重要。

指针的概念:

  • 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
  • 指针的大小是固定的4/8个字节(32位平台/64位平台)。
  • 指针是由类型决定指针的+-整数的步长。

字符指针

在指针的类型中有一种指针类型为字符指针char*:

示例:

// 一般使用
int main()
{char ch = 'w';char *pc = &ch;*pc = 'w';return 0;
}// 还有一种使用方式如下
int main()
{const char* pstr = "hello bit.";//这里是把字符串的首字符放到了pstr指针里printf("%s\n", pstr);return 0;
}

 相当于就是把首字符h的地址存放到指针变量ptsr中。

指针数组

指针数组是一个数组,其每个元素都是指针类型。这在处理字符串数组或动态数组等场景下特别有用。

#include <stdio.h>int main() {int a = 10, b = 20, c = 30;// 定义一个指针数组int *arr[3] = {&a, &b, &c};// 访问指针数组的元素for(int i = 0; i < 3; i++) {printf("%d ", *arr[i]);}return 0;
}int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组

数组指针

数组指针就是能够指向数组的指针。

示例:

int (*p)[10];
//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个
//指针,指向一个数组,叫数组指针。
//这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。

&数组名VS数组名

&arr表示的是数组的地址,而arr表示的是数组首元素的地址。

示例:

#include <stdio.h>
int main()
{int arr[10] = { 0 };printf("arr = %p\n", arr);printf("&arr= %p\n", &arr);printf("arr+1 = %p\n", arr+1);printf("&arr+1= %p\n", &arr+1);return 0;
}

数组的地址+1,跳过整个数组的大小,所以&arr+1相当于&arr的差值是40。

函数指针

函数指针指向函数的入口地址。这允许将函数作为参数传递给其他函数,或创建可调用的函数表。

示例:

#include <stdio.h>// 简单的比较函数
int compare(int a, int b) {return a > b;
}int main() {// 定义函数指针int (*funcPtr)(int, int) = compare;// 使用函数指针调用函数int result = funcPtr(5, 3);printf("Result: %d\n", result);return 0;
}

函数指针数组

int (*parr1[10])();

parr1先和[ ]结合,说明parr1是数组,数组的内容就是int(*)()类型的函数指针。

双重指针

双重指针或指向指针的指针是指向另一个指针地址的指针。这在需要通过引用修改指针本身的值,或者处理多级动态数据结构时非常有用。

示例:

#include <stdio.h>int main() {int value = 5;int *ptr = &value;int **pptr = &ptr;// 使用双重指针访问valueprintf("Value = %d\n", **pptr);return 0;
}

这里首先创建了一个指向value的指针ptr。然后定义了一个双重指针pptr,让它指向ptr的地址。最后通过双重指针pptr打印value的值。

指针与多维数组

在处理多维数组时,可以使用指针来遍历数组元素,这在动态分配多维数组时特别常见。

#include <stdio.h>
#include <stdlib.h>int main() {int rows = 2, cols = 3;int **array = (int **)malloc(rows * sizeof(int *));for(int i = 0; i < rows; i++) {array[i] = (int *)malloc(cols * sizeof(int));}// 给多维数组赋值并打印for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {array[i][j] = i + j;printf("%d ", array[i][j]);}printf("\n");}// 释放内存for(int i = 0; i < rows; i++) {free(array[i]);}free(array);return 0;
}

首先动态分配一个双重指针array来创建一个二维数组。接着每一行都动态分配了内存以存储整数。然后使用嵌套循环给多维数组赋值并打印。最后释放为每行以及整个数组分配的内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/247514.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一次北斗接收机调试总结

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 最近项目中要用到北斗接收机&#xff0c;它的样子是长这样的&#xff1a; 这部机器里面是没有操作系统的&#xff0c;由单片机控制。最近我们要根据协议…

使用UART和USART在STM32上进行双向通信

在本文中&#xff0c;我们将深入了解如何在STM32上使用UART&#xff08;通用异步收发传输器&#xff09;和USART&#xff08;通用同步异步收发传输器&#xff09;实现双向通信。UART和USART是常见的串口通信协议&#xff0c;通常用于与其他设备进行数据传输。我们将重点介绍如何…

【C++】STL简介(了解)【STL的概念,STL的历史缘由,STL六大组件、STL的重要性、以及如何学习STL、STL的缺陷的讲解】

这里写自定义目录标题 一、什么是STL二、STL的版本1. 原始版本2. P. J. 版本3. RW版本★ 4. SGI版本 三、STL的六大组件四、STL的重要性五、如何学习STL六、STL的缺陷 一、什么是STL STL ( standard template libaray - 标准模板库 )&#xff1a;是C标准库 的重要组成部分&…

YoloV5改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移

摘要 https://arxiv.org/pdf/2311.12770.pdf https://github.com/hongyuanyu/SPAN SPAN是一种超分网络模型。SPAN模型通过使用参数自由的注意力机制来提高SISR的性能。这种注意力机制能够增强重要信息并减少冗余,从而在图像超分辨率过程中提高图像质量。 具体来说,SPAN模…

HOST文件被挟持,无法上网,如何解决。

问题&#xff1a; 晚上开机&#xff0c;突然发现无法联网&#xff0c;提示网络异常 解决&#xff1a; 首先网络诊断&#xff0c;host文件被劫持&#xff0c;修复后&#xff0c;仍然不行。 然后测试手机热点&#xff0c;发现仍然无法联网 尝试用火绒修复&#xff0c;无果。 所有…

算法通关村第十六关-黄金挑战滑动窗口与堆的结合

大家好我是苏麟 , 今天带来一道小题 . 滑动窗口最大值 描述 : 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 题目 : …

通讯录管理系统(基于C语言)

模块设计 本通讯录管理系统功能模块共包括9个部分&#xff1a;1.输入数据、2.显示数据、 3.插入数据、4.删除数据、5.查看数据、6.修改数据、7.保存数据、 8.返回主菜单、9.退出系统. 一&#xff0e;总体设计 通讯录的每一条信息包括&#xff1a;姓名、性别、住址、联系电话…

VirtualBox安装Centos7.9

目录 1、下载Centos7.9镜像 2、新建虚拟电脑 3、虚拟电脑配置 3.1、配置CPU 3.2、设置启动顺序(光驱放在第一个) 3.3、设置存储 3.4、设置网络(桥接网卡) 4、启动 启动 等待 选择安装过程中语言 安装位置 开始安装 设置root账号密码 重启 输入用户名和密码登录…

[英语学习][7][Word Power Made Easy]的精读与翻译优化

[序言] 这次翻译, 遇到非常细微的短语, 让我差点翻车. 我从7点半开始思考到10点, 才恍然大悟. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西, 同时加入我的社区讨论与交流英语相关的内容. [原著英文与翻译版对照][第19] …

【模电】直流通路与交流通路

直流通路与交流通路 通常&#xff0c;在放大电路中&#xff0c;直流电源的作用和交流信号的作用总是共存的&#xff0c;即静态电流、电压和动态电流、电压总是共存的。但是由于电容、电感等电抗元件的存在&#xff0c;直流量所流经的通路与交流信号所流经的通路不完全相同。因此…

项目实战之RabbitMQ死信队列应用

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 文章目录 &#x1f31f;架构图&#x…

Java 基础学习(五)面向对象编程-对象和类

1 类和对象 1.1 面向对象概述 1.1.1面向对象简史 面向对象编程思想最初的起源可以追溯到1960年的Simula语言&#xff0c;这被认为是第一个支持面向对象编程概念的语言。Simula引入了类、对象、继承等概念&#xff0c;将数据和操作进行封装。Simula的创始人奥利-约翰达尔&…