首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 语言指针使用入门(一)

     編輯:關於C語言

指针基础:地址、解引用与类型安全

指针是存储内存地址的变量。理解指针的关键在于区分“指针本身的值(地址)”与“指针指向的对象(解引用后的值)”。

1. 声明与初始化

int a = 42;
int *p = &a;      // p 保存 a 的地址
int *q = NULL;    // 空指针,表示“不指向任何对象”

* 在声明中表示“这是一个指针类型”,在表达式中表示“解引用/取值”。

2. 基本操作

printf("%p\n", (void*)p);  // 打印地址,需转 void*
printf("%d\n", *p);        // 解引用:读取 a 的值 42
*p = 100;                  // 解引用赋值:修改 a 为 100

3. 指针与数组的关系

  • 数组名在大多数表达式中退化为指向首元素的指针:a == &a[0]。
  • a[i] 等价于 *(a + i),编译器自动按 sizeof(int) 缩放偏移。
  • 但 sizeof(a) 给出整个数组大小,而 sizeof(p) 仅为指针大小(通常 8 字节)。

4. 动态内存分配

int *arr = malloc(10 * sizeof(int));
if (!arr) { perror("malloc"); return 1; }
for (int i=0; i<10; ++i) arr[i] = i*i;
free(arr);
arr = NULL;  // 防野指针

永远检查 malloc 返回值;释放后置 NULL 是良习。

5. const 与指针的组合

声明含义
const int *p / int const *p指向常量的指针:不可通过 p 修改值,p 可指向别处
int *const p常量指针:p 本身不可改指向,但可修改指向的值
const int *const p常量指针指向常量:双重不可变

口诀:* 左边的 const 修饰指向的值,右边的修饰指针本身。

6. 多级指针

int a = 10;
int *p = &a;
int **pp = &p;   // 二级指针
**pp = 20;       // 修改 a

常用于函数修改实参指针(如 void init(int **out))、动态二维数组、链表节点删除等场景。

7. 避坑清单

  1. 未初始化指针直接解引用 → 崩溃或 UB。
  2. 释放后继续使用 → 堆破坏。
  3. 指针越界访问 → 缓冲区溢出。
  4. 函数返回栈上局部变量地址 → 悬垂指针。
  5. scanf("%d", p) 忘记取地址 → 应为 &p 或直接传指针变量。

练习建议

  1. 手写字符串反转、链表插入/删除、二叉树遍历。
  2. 用 valgrind --leak-check=full 检测内存错误。
  3. 阅读 glibc、Linux 内核 中经典数据结构的指针操作。

结语

指针看似晦涩,实则是对内存模型的直接映射。牢记“地址、类型、生命周期”三要素,多练、多调试、多读优秀代码,指针终将成为你手中最锋利的工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved