C语言指针学习笔记

1. 指针的定义

指针(Pointer)是存储变量地址的变量。在C语言中,指针是一种非常重要的数据类型,通过指针可以直接访问和操作内存。

2. 指针的声明与初始化

2.1 指针声明

指针变量的声明格式为:数据类型 *指针变量名;

c 复制代码
int *ptr;    // 声明一个指向int类型的指针
char *cptr;  // 声明一个指向char类型的指针

2.2 指针初始化

指针变量初始化时,可以将变量的地址赋值给指针,使用地址运算符&

c 复制代码
int a = 10;
int *ptr = &a; // 将变量a的地址赋值给指针ptr

3. 指针的使用

3.1 访问指针所指向的变量

通过解引用运算符*可以访问指针所指向的变量的值。

c 复制代码
int a = 10;
int *ptr = &a;
printf("Value of a: %d\n", *ptr); // 输出a的值

3.2 修改指针所指向的变量

通过指针可以修改指针所指向的变量的值。

c 复制代码
int a = 10;
int *ptr = &a;
*ptr = 20; // 修改a的值为20
printf("Modified value of a: %d\n", a); // 输出修改后的a的值

4. 指针的运算

指针可以进行算术运算,如加减操作,但要注意指针运算的结果依赖于指针指向的数据类型。

c 复制代码
int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("Value at ptr: %d\n", *ptr); // 输出1
ptr++;
printf("Value at ptr after increment: %d\n", *ptr); // 输出2

5. 指针数组与数组指针

5.1 指针数组

指针数组是一个数组,其元素是指针。

c 复制代码
int a = 1, b = 2, c = 3;
int *arr[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++) {
    printf("Value at arr[%d]: %d\n", i, *arr[i]);
}

5.2 数组指针

数组指针是指向数组的指针。

c 复制代码
int arr[3] = {1, 2, 3};
int (*ptr)[3] = &arr;
for (int i = 0; i < 3; i++) {
    printf("Value at ptr[%d]: %d\n", i, (*ptr)[i]);
}

6. 函数指针

函数指针是指向函数的指针,可以通过函数指针调用函数。

c 复制代码
#include <stdio.h>

void hello() {
    printf("Hello, World!\n");
}

int main() {
    void (*func_ptr)() = hello; // 声明并初始化函数指针
    func_ptr(); // 通过函数指针调用函数
    return 0;
}

7. 指针与动态内存分配

在C语言中,可以使用malloccallocreallocfree函数进行动态内存分配和释放。

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int*)malloc(sizeof(int) * 5); // 动态分配内存
    if (ptr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }
    for (int i = 0; i < 5; i++) {
        ptr[i] = i + 1;
    }
    for (int i = 0; i < 5; i++) {
        printf("Value at ptr[%d]: %d\n", i, ptr[i]);
    }
    free(ptr); // 释放内存
    return 0;
}

8. 常见指针错误

8.1 野指针

野指针指向未分配或已释放的内存。

c 复制代码
int *ptr;
*ptr = 10; // 未初始化指针,可能导致程序崩溃

8.2 空指针解引用

解引用空指针会导致程序崩溃。

c 复制代码
int *ptr = NULL;
*ptr = 10; // 解引用空指针,可能导致程序崩溃
相关推荐
欢乐熊嵌入式编程29 分钟前
智能手表固件升级 OTA 策略文档初稿
嵌入式硬件·学习·智能手表
起床学FPGA42 分钟前
异步FIFO的学习
学习·fpga开发
依年南台1 小时前
搭建大数据学习的平台
大数据·学习
孤寂大仙v1 小时前
【Linux笔记】——进程信号的产生
linux·服务器·笔记
小虎卫远程打卡app1 小时前
视频编解码学习10之成像技术原理
学习·计算机视觉·视频编解码
愚戏师2 小时前
Linux复习笔记(三) 网络服务配置(web)
linux·运维·笔记
Despacito0o2 小时前
RGB矩阵照明系统详解及WS2812配置指南
c语言·线性代数·矩阵·计算机外设·qmk
X Y O2 小时前
神经网络初步学习——感知机
人工智能·神经网络·学习·感知机
小王努力学编程2 小时前
高并发内存池(三):TLS无锁访问以及Central Cache结构设计
jvm·数据结构·c++·学习
hnlucky3 小时前
通俗易懂版知识点:Keepalived + LVS + Web + NFS 高可用集群到底是干什么的?
linux·前端·学习·github·web·可用性测试·lvs