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

C语言指针学习笔记

1. 指针的定义

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

2. 指针的声明与初始化

2.1 指针声明

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

int *ptr;    // 声明一个指向int类型的指针
char *cptr;  // 声明一个指向char类型的指针

2.2 指针初始化

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

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

3. 指针的使用

3.1 访问指针所指向的变量

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

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

3.2 修改指针所指向的变量

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

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

4. 指针的运算

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

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 指针数组

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

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 数组指针

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

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. 函数指针

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

#include <stdio.h>

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

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

7. 指针与动态内存分配

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

#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 野指针

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

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

8.2 空指针解引用

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

int *ptr = NULL;
*ptr = 10; // 解引用空指针,可能导致程序崩溃

相关文章:

  • 深入浅出TypedArray:网络数据处理、WebGPU与加密实战
  • 从入门到跑路(六)k8s配置ingress-nginx
  • 代码随想录算法【Day50】
  • Pycharm中查找与替换
  • 计算机网络-OSI七层参考模型与数据封装,网络安全零基础入门到精通实战教程!
  • ZLMediaKit Windows 编译指南
  • 大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(3)
  • Java-如何将其他地方拉取的jar包导入本地maven环境
  • vue3中<el-table-column>状态的显示
  • Vue 3 工程化打包工具:从理论到实践 (下篇)
  • dify实现分析-rag-关键词索引的实现
  • 1.16学习
  • 前端面试场景题 1 (批量处理toast、减少if-else)
  • DeepSeek和ChatGPT的全面对比
  • ESP32 在IDF_V5.3.1版本下实现AP无线热点模式!(带WIFI事件处理)
  • 剑指 Offer II 025. 链表中的两数相加
  • #渗透测试#批量漏洞挖掘#某华-APPGetUser SQL注入漏洞
  • MySQL锁
  • UE5.3 C++ USTRUCT 的再次理解
  • 143.WEB渗透测试-信息收集-小程序、app(14)
  • 阿里上季度营收增7%:淘天营收创新高,AI产品营收连续七个季度三位数增长
  • 丰富“互换通”产品类型,促进中国金融市场高水平对外开放
  • 泰山、华海、中路等山东险企综合成本率均超100%,承保业务均亏损
  • 3年多来俄乌要首次直接对话?能谈得拢吗?
  • 日本前卫艺术先驱群展上海:当具体派相遇古树古宅
  • 杭州“放大招”支持足球发展:足球人才可评“高层次人才”