当前位置: 首页 > ops >正文

【C语言】指针详解(接)

前言:
文接上章,在上章节讲解了部分指针知识点,在本章节为大家继续提供。

六·指针与字符串:C 语言字符串的本质

在 C 语言中,字符串实际上是一个以\0结尾的字符数组。字符串常量本质上是指向字符数组首元素的指针:

char *str = "Hello, World!"; // 字符串常量存储在只读内存区
printf("%s\n", str);         // 输出Hello, World!
printf("首字符:%c\n", *str); // 输出H
printf("第3个字符:%c\n", *(str + 2)); // 输出l

动态分配字符串: 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() 
{char *str = (char *)malloc(20 * sizeof(char)); // 动态分配20字节内存if (str == NULL) 
{printf("内存分配失败\n");return 1;}strcpy(str, "Dynamic String"); // 复制字符串到分配的内存printf("%s\n", str); // 输出Dynamic Stringfree(str); // 释放内存,防止内存泄漏return 0;
}

malloc函数在内存函数中讲解过,想要详细了解的可以点开主页,看一下文章。 

七·多级指针:指针的指针

指针变量本身也有自己的内存地址,因此可以定义指向指针的指针(多级指针):

int num = 10;
int *p = &num;     // 一级指针,指向int
int **pp = &p;     // 二级指针,指向int*
int ***ppp = &pp;  // 三级指针,指向int**printf("num的值:%d\n", ***ppp); // 解引用三次,输出10

多级指针常用于需要修改一级指针本身的场景,比如动态分配二维数组:

int **matrix;
int rows = 3, cols = 4;// 分配行指针数组
matrix = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) 
{// 为每一行分配列元素matrix[i] = (int *)malloc(cols * sizeof(int));
}// 使用二维数组
matrix[0][0] = 100;// 释放内存
for (int i = 0; i < rows; i++) 
{free(matrix[i]);
}
free(matrix);

八·常见指针错误

野指针:未初始化的指针

int *p;
*p = 10; // 错误!p指向随机地址

空指针解引用

int *p = NULL;
*p = 10; // 错误!解引用空指针

内存泄漏:动态分配的内存未释放

int *p = (int *)malloc(sizeof(int));
// 使用p
// 忘记free(p)

 九·总结

 

  1. 指针变量存储的是内存地址
  2. 通过解引用操作符*可以访问和修改内存中的数据
  3. 指针算术允许在内存中移动
  4. 指针是实现数组、字符串、动态内存分配和复杂数据结构的基础
  5. 使用指针时必须特别注意内存管理和避免常见错误

 

 

 

http://www.xdnf.cn/news/9720.html

相关文章:

  • 游戏盾在非游戏行业的应用实践与价值分析
  • 立志成为一名优秀测试开发工程师(第九天)——使用fiddler工具、request库进行接口测试
  • GitCode镜像门法律分析:PL协议在中国的司法实践
  • Python 生成器:从基础到高级
  • 【Ubuntu】Ubuntu网络管理
  • Vscode 解决 #include <> 找不到的问题
  • x86_64-apple-ios-simulator 错误
  • 政策+技术双轮驱动:MiC建筑如何成为“好房子”建设的破局之道
  • UE5.5 pixelstreaming插件打包报错
  • UE5打包项目设置Project Settings(打包widows exe安装包)
  • 《深入解析UART协议及其硬件实现》-- 第三篇:UART ASIC实现优化与低功耗设计
  • 图像数据与显存
  • WebFuture:后台修改内容链接地址保存提示内容链接地址禁止输入外部url链接
  • Spring Boot自动装配原理
  • QT+opecv如何更改图片的拍摄路径
  • Oracle 慢sql排查
  • 前端面试准备2
  • Axure设计案例——科技感渐变柱状图
  • 24点游戏的最小数字组合问题
  • 常见关系型数据库对比指南
  • 制造业的未来图景:超自动化与劳动力转型的双重革命
  • 数据库中常见的锁机制详解
  • Java设计模式之迭代器模式详解
  • Sigma-Aldrich胰蛋白酶细胞解离方案速览
  • 从零开始的云计算生活——第十四天,困难重重,安全管理。
  • 第4讲、Odoo 18 模块系统源码全解与架构深度剖析【modules】
  • Axure项目实战:驾驶舱(数据一张图)制作教程
  • 【Deepseek 学网络互联】跨节点通信global 和节点内通信CLAN保序
  • 新一代Python管理UV完全使用指南|附实际体验与效果对比
  • Ubuntu系统如何部署Crawlab爬虫管理平台(通过docker部署)