找回密码
 立即注册
搜索
热搜: STM32
查看: 58|回复: 0

C语言指针完全指南 - 新手也能看懂的指针教程

[复制链接]

28

主题

0

回帖

102

积分

注册会员

积分
102
发表于 2026-3-22 17:13:43 |北京| 显示全部楼层 |阅读模式
【C语言入门】指针完全指南 - 看完这篇再也不怕指针

什么是指针?
指针就是一个变量,它存储的是另一个变量的内存地址。

基本语法:
int a = 42;       // 普通变量,存储值42
int *p = &a;      // 指针变量,存储a的地址

两个关键运算符:
& 取地址符 - 获取变量的内存地址
* 解引用符 - 获取地址上存储的值

示例一:指针基础用法

#include <stdio.h>

int main() {
    int a = 10;
    int *p = &a;

    printf("a的值: %d\n", a);        // 输出: 10
    printf("a的地址: %p\n", &a);     // 输出: 0x7ffd...
    printf("p的值: %p\n", p);        // 输出: 和&a一样
    printf("*p的值: %d\n", *p);      // 输出: 10

    // 通过指针修改a的值
    *p = 20;
    printf("修改后a的值: %d\n", a);  // 输出: 20

    return 0;
}

示例二:指针与数组

#include <stdio.h>

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int *p = arr;  // 数组名就是首元素地址

    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, *(p + i));
    }

    return 0;
}

示例三:用指针交换两个数

#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    printf("交换前: x=%d, y=%d\n", x, y);

    swap(&x, &y);

    printf("交换后: x=%d, y=%d\n", x, y);
    return 0;
}

示例四:动态内存分配

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5;
    int *arr = (int *)malloc(n * sizeof(int));

    if (arr == NULL) {
        printf("内存分配失败!\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        arr[i] = (i + 1) * 10;
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    free(arr);  // 一定要释放内存!
    return 0;
}

新手常犯的错误:

错误1:未初始化的指针
int *p;    // 危险!p指向随机地址
*p = 10;   // 可能导致程序崩溃

正确做法:
int *p = NULL;  // 先置空
p = &a;         // 再赋值

错误2:野指针
int *p = (int *)malloc(sizeof(int));
free(p);
*p = 10;  // 错误!p指向的内存已释放

错误3:内存泄漏
int *p = (int *)malloc(sizeof(int));
// 忘记free(p),内存永远不会释放

指针速查表:
int *p;          // 指向int的指针
int **pp;        // 指向指针的指针
int arr[5];      // arr本质上是指向首元素的指针
void (*func)(int); // 指向函数的指针

练习题:写一个函数,用指针找出数组中的最大值。

void find_max(int *arr, int size, int *max) {
    *max = arr[0];
    for (int i = 1; i < size; i++) {
        if (arr[i] > *max)
            *max = arr[i];
    }
}

搞懂指针,C语言就算入门了!有问题欢迎回帖讨论!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Discuz! X

GMT+8, 2026-4-5 14:30 , Processed in 0.030785 second(s), 20 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表