【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. 使用指针时必须特别注意内存管理和避免常见错误
相关推荐
泡海椒13 分钟前
JQuick-Excel dateFormat 转换实战:日期值与 FORMAT 显示格式的边界
开发语言·python·excel
水饺编程25 分钟前
第1章:下载 Linux 0.12 内核
linux·c语言·汇编·ubuntu
白杨尚青28 分钟前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
江江爱编程33 分钟前
java零基础保姆级教学01
java·开发语言
沐晓时光1 小时前
C语言入门,深入理解指针(2)
c语言·开发语言
Logic1011 小时前
C语言/数据结构贪心算法题解:字符串趋同——逐位统计最高频率求最小修改代价
c语言·数据结构·贪心算法·字符串·时间复杂度·频率统计·算法题
水饺编程1 小时前
第1章:开发环境搭建,在 Windows 中安装 Git
linux·c语言·汇编·git·ubuntu
2601_962885721 小时前
如何用 Python 做均线粘合选股?(多头发散前的变盘候选)
开发语言·python
2601_962071571 小时前
类变量和全局变量的隔离性有什么区别?
java·开发语言·jvm
H.莓飛1 小时前
【Linux】命令行参数、环境变量与程序地址空间
linux·c语言·chrome·后端·centos