C语言指针核心概念与数据类型详解

小石头
小石头
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析C语言中指针的核心概念,明确区分自身类型与指向类型的定义方法。通过数值型和字符/字符串指针的代码示例,演示指针定义、初始化以及不同数据类型的显示方式,帮助开发者快速掌握指针的基础应用。

指针概述

C语言中的指针本质上也是一种变量类型,但其存储的内容是内存地址而非直接的数据值(如整数或字符)。理解指针的关键在于区分其“自身类型”与“指向的类型”。对于任意指针声明:

  • 自身类型:即指针变量本身的类型,表现为基本类型加上星号(例如 int*),它决定了编译器如何对指针进行解引用时的步长处理。
  • 指向的类型:即指针所指向的内存空间中的数据类型,去掉变量名和最近的星号后剩余的部分即为指向类型。

自身类型的作用

由于计算机内存是按字节编址的,不同数据占据的空间大小不同(如 int 通常为4字节,short为2字节)。自身类型决定了当程序执行指针运算(如 p+1)时,地址偏移多少个字节。如果是指向整型的指针,加1意味着跳过当前整数的4个字节,移动到下一个整数单元。

指向类型的作用

指向类型告诉编译器在解引用(如 *p)时应读取多少个字节以及以何种格式解释这些数据。例如二级指针 int** pp = &p; 说明 pp 本身是指针,但它指向的内容也是一个指针变量。

int num = 10;
int* p = NULL;      // 定义自身类型为 int*, 指向类型为 int
p = #           // 将 num 的地址赋给 p
printf("%d", *p);   // 输出 10

代码实例解析

以下综合代码展示了基本变量、数组及字符串在内存中的地址分布与指针获取方式:

#include <stdio.h>
int main() {
    // 1. 整形指针
    int num = 100;
    int* p = &num;
    printf("num: %d, addr: %#lx\n", num, &num);
    printf("p points to: %d, at: %#lx\n", *p, p);

    // 2. 数组首地址与指针的关系
    int arr[5] = {10, 20, 30, 40, 50};
    // 数组名在多数情况下退化为指向首元素的指针
    printf("arr is same as &arr[0]: %s\n", (arr == &arr[0]) ? "true" : "false");
    
    int* parr = arr; // 等价于 parr = &arr[0];
    printf("First element via pointer: %d, Third element: %d\n", *parr, *(parr + 2));
    return 0;
}

数值型指针

数值型指针是最常见的形式,用于存储整型(int)、浮点型(float/double)变量的地址。

定义与初始化

既可以在声明的同时赋值(如 int* p = &var;),也可以先定义空指针再赋值。需要注意的是,指针在使用前必须指向有效的内存地址,否则直接解引用会导致程序崩溃。

int value = 88;
int* ptr_int = &value;

float f_value = 3.14;
float* ptr_float = &f_value;
// 错误示范:指向未初始化的随机地址
// float* bad_ptr = malloc(sizeof(float)); 
// printf("%.2f", *bad_ptr); 

字符与字符串型指针

字符处理是C语言的另一重点,字符指针既可以指向单个字符,也可以作为字符串数组的别名使用。

单字符指针

指向 char 类型的变量时,解引用获取一个字节大小的字符,打印时需使用 %c 占位符。

char name_char = 'A';
char* pc = &name_char;
printf("Single char: %c\n", *pc);  // 输出 A

字符数组与字符串指针

字符数组在内存中是一段连续空间,末尾通常隐含或显式包含 '\0' 结束符。字符数组名本身就代表了该数组首元素(第一个字符)的地址。因此,指针可以直接通过赋值的方式关联到数组:

char str_arr[] = "Hello";
// str_arr 自动转换为 &str_arr[0]
char* ps = str_arr;

printf("String content: %s\n", ps);     // 整体输出 Hello
printf("First char: %c\n", *ps);       // 单独取出 H
printf("Third char: %c\n", *(ps + 2)); // 取出 l

关键注意点:

  1. 显示差异:若用 %s 打印字符串指针或数组名,会打印整个字符串直到遇到 '\0';若用 %c 则只打印首字母。若误用 %x 打印字符串内容也会因截断或乱码导致不可读。
  2. 长度计算:手动定义字符数组时建议预留足够空间以容纳结束符。例如 char buf[6] 存
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表