2、C语言指针专题:指针与基本数据类型

发布时间:2026/6/9 19:38:19

2、C语言指针专题:指针与基本数据类型 指针的核心作用是通过内存地址间接访问数据而指针的类型必须与它所指向的数据类型相匹配特殊情况除外如void*指针。不同基本数据类型整型、字符型、浮点型等的变量在内存中占用的字节数、存储格式不同对应的指针也会呈现出不同的特性。本文将逐一讲解指向各类基本数据类型的指针以及const关键字与指针结合的用法每个知识点均搭配程序示例帮助初学者快速掌握其核心用法。二、指针与基本数据类型指针的类型由“所指向的数据类型 *”构成指针类型决定了两个关键一是解引用时访问的内存字节数二是指针算术运算时的偏移量。下面分别讲解指向不同基本数据类型的指针用法。2.1 指向整型的指针 (int *)指向整型的指针int *专门用于存储int类型变量的内存地址解引用时会访问4字节内存32位/64位系统均如此指针算术运算时偏移量为4字节即int类型的字节数。适用场景访问、修改int类型变量的值遍历int类型数组等。#include stdio.hint main() {// 1. 指向单个int变量的指针int num 100;int *p_num num; // 定义int*指针指向num的地址printf(num的值%d\n, num); // 输出num的值100printf(p_num存储的地址%p\n, p_num); // 输出num的内存地址printf(解引用p_num的值%d\n, *p_num); // 输出100访问num的值// 通过指针修改num的值*p_num 200;printf(修改后num的值%d\n, num); // 输出修改后num的值200// 2. 指向int数组的指针遍历数组int arr[] {10, 20, 30, 40};int *p_arr arr; // 数组名是首元素地址等价于arr[0]printf(\n数组元素遍历);for (int i 0; i 4; i) {// p_arr i 指向arr[i]偏移量为i*4字节printf(%d , *(p_arr i)); // 输出10 20 30 40}printf(\n);return 0;}2.2 指向字符的指针 (char *)指向字符的指针char *用于存储char类型变量或字符串的内存地址。char类型占用1字节因此char*指针解引用时访问1字节内存算术运算时偏移量为1字节。特别注意char*指针常用来操作字符串字符串本质是char类型的数组以\0作为结束标志。#include stdio.hint main() {// 1. 指向单个char变量的指针char ch A;char *p_ch ch;printf(ch的值%c\n, ch); // 输出ch的值Aprintf(p_ch存储的地址%p\n, p_ch); // 输出ch的内存地址printf(解引用p_ch的值%c\n, *p_ch); // 输出A// 修改ch的值*p_ch B;printf(修改后ch的值%c\n, ch); // 输出修改后ch的值B// 2. 指向字符串的char*指针最常用场景char *str Hello, C!; // str指向字符串首元素H的地址printf(\n字符串%s\n, str); // 输出Hello, C!// 遍历字符串通过指针偏移char *p_str str;printf(字符串遍历);while (*p_str ! \0) { // 直到遇到结束标志\0printf(%c, *p_str);p_str; // 偏移1字节指向 next 字符}printf(\n);return 0;}注意char*指针指向字符串常量如Hello, C!时不可修改字符串内容否则会触发内存访问错误若需修改字符串需指向char类型数组。2.3 指向浮点型的指针 (float *, double *)浮点型分为float单精度和double双精度对应的指针分别为float*和double*。两者的核心区别的是占用字节数不同float占用4字节double占用8字节因此指针解引用时访问的内存字节数和算术运算偏移量也不同。#include stdio.hint main() {// 1. 指向float类型的指针float f_num 3.14f; // float类型需加f后缀否则默认是doublefloat *p_float f_num;printf(float类型\n);printf(f_num的值%.2f\n, f_num); // 输出3.14printf(p_float存储的地址%p\n, p_float); // 输出f_num的地址printf(解引用p_float的值%.2f\n, *p_float); // 输出3.14// 2. 指向double类型的指针double d_num 3.1415926;double *p_double d_num;printf(\ndouble类型\n);printf(d_num的值%.6f\n, d_num); // 输出3.141593printf(p_double存储的地址%p\n, p_double); // 输出d_num的地址printf(解引用p_double的值%.6f\n, *p_double); // 输出3.141593// 验证指针偏移量float偏移4字节double偏移8字节printf(\n指针偏移验证\n);printf(p_float 1 的地址%p\n, p_float 1); // 比原地址大4printf(p_double 1 的地址%p\n, p_double 1); // 比原地址大8return 0;}说明float*指针不能直接指向double类型变量反之亦然否则会导致类型不匹配解引用时出现数据失真内存访问字节数不匹配。2.4 指向空类型的指针 (void *)void*指针称为“空类型指针”是一种特殊的指针类型它不指向任何具体的数据类型能存储任意类型变量的内存地址。核心特性① 不能直接解引用因为编译器不知道要访问多少字节内存② 不能直接进行算术运算因为不知道偏移量③ 可作为通用指针需强制转换为具体类型后才能使用。适用场景函数参数接收任意类型指针、动态内存分配malloc函数返回值为void*等。#include stdio.h#include stdlib.h // 包含malloc函数// 通用打印函数接收void*指针根据类型打印void printData(void *data, char type) {switch (type) {case i: // 整型printf(整型数据%d\n, *(int*)data); // 强制转换为int*后解引用break;case c: // 字符型printf(字符数据%c\n, *(char*)data); // 强制转换为char*后解引用break;case f: // 浮点型floatprintf(float数据%.2f\n, *(float*)data);break;}}int main() {int a 10;char b X;float c 5.5f;// void*指针存储任意类型地址void *p_void;p_void a; // 存储int类型地址printData(p_void, i); // 输出整型数据10p_void b; // 存储char类型地址printData(p_void, c); // 输出字符数据Xp_void c; // 存储float类型地址printData(p_void, f); // 输出float数据5.50// 动态内存分配malloc返回void*需强制转换int *p (int*)malloc(sizeof(int)); // 强制转换为int**p 100;printf(\n动态分配的整型数据%d\n, *p);free(p); // 释放内存return 0;}2.5 const关键字与指针const关键字用于修饰变量表示“只读”不能被修改。当const与指针结合时会产生三种不同的效果核心区别在于“const修饰的是指针本身”还是“指针指向的数据”需重点区分。2.5.1 指向常量的指针 (const int *)语法const 数据类型 * 指针变量名;核心特点指针指向的数据是只读的不能通过指针修改但指针本身可以指向其他地址const修饰的是“指针指向的数据”。2.5.2 常量指针 (int * const)语法数据类型 * const 指针变量名;核心特点指针本身是只读的不能指向其他地址但指针指向的数据可以修改const修饰的是“指针本身”。注意常量指针必须初始化因为指针本身不能修改无法后续赋值。2.5.3 指向常量的常量指针 (const int * const)语法const 数据类型 * const 指针变量名;核心特点指针本身是只读的不能指向其他地址且指针指向的数据也是只读的不能通过指针修改const同时修饰指针和指向的数据。注意必须初始化且后续既不能修改指针指向也不能通过指针修改数据。记忆技巧const靠近谁就修饰谁——靠近数据类型如const int *p修饰指向的数据靠近指针变量名如int *const p修饰指针本身两者都靠近就都修饰。指针与基本数据类型的匹配是C语言指针使用的基础不同类型的指针对应不同的内存访问字节数和偏移量不可随意混用void*指针作为通用指针需强制转换后才能使用const与指针结合的三种形式核心是区分“修饰指针”还是“修饰指向的数据”。掌握这些知识点后能更规范地使用指针避免类型不匹配、非法修改等错误为后续学习指针的进阶用法如指针数组、函数指针打下坚实基础。实际编程中需根据需求选择合适类型的指针并善用const关键字保护数据安全。

相关新闻