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

前言:

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

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

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

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

动态分配字符串:

cs 复制代码
#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 String
    
    free(str); // 释放内存,防止内存泄漏
    return 0;
}

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

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

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

cs 复制代码
int num = 10;
int *p = &num;     // 一级指针,指向int
int **pp = &p;     // 二级指针,指向int*
int ***ppp = &pp;  // 三级指针,指向int**

printf("num的值:%d\n", ***ppp); // 解引用三次,输出10

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

cs 复制代码
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);

八·常见指针错误

野指针:未初始化的指针

cs 复制代码
int *p;
*p = 10; // 错误!p指向随机地址

空指针解引用

cs 复制代码
int *p = NULL;
*p = 10; // 错误!解引用空指针

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

cs 复制代码
int *p = (int *)malloc(sizeof(int));
// 使用p
// 忘记free(p)

九·总结

  1. 指针变量存储的是内存地址
  2. 通过解引用操作符*可以访问和修改内存中的数据
  3. 指针算术允许在内存中移动
  4. 指针是实现数组、字符串、动态内存分配和复杂数据结构的基础
  5. 使用指针时必须特别注意内存管理和避免常见错误
相关推荐
冯汉栩6 分钟前
Swift Control RollingCountdownView(动画倒计时)
开发语言·ios·swift
lisanmengmeng9 分钟前
搭建elk环境并接入frostmourne,实现监控报警效果(五)
开发语言·elk·日志·日志监控
oh,huoyuyan42 分钟前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
风流 少年1 小时前
hutool
java·服务器·开发语言
单片机仿真设计1 小时前
【proteus仿真】基于 STM32 的智能垃圾桶设计(仿真图+程序)
c语言·stm32·stm32单片机·proteus·毕设·仿真
一木 之林2 小时前
四、STL容器与数据结构
开发语言·数据结构·c++
QX_hao2 小时前
【Go】--Cobra-cli的用法
开发语言·后端·golang
艾醒(AiXing-w)2 小时前
LangChain 1.0 入门(三):稳定性双核心——重试机制+速率限速器参数详解与实战
开发语言·langchain·php
总有刁民想爱朕ha2 小时前
Python PyQt5图片批量转MP4视频工具:本地离线免费无水印,完整代码
开发语言·python·qt
宸津-代码粉碎机3 小时前
FastUtil+AI多Agent实战:Java AI项目性能终极加速方案
java·服务器·开发语言·python·安全·php